/ Hex Artifact Content
Login

Artifact afe256e29f62733d8d8816c220eb822a6317a444:


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 36 20 32 30  ild.c,v 1.136 20
0310: 30 33 2f 30 33 2f 33 30 20 30 30 3a 31 39 3a 35  03/03/30 00:19:5
0320: 30 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  0 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 66 61 6b  ** This is a fak
0590: 65 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e callback proce
05a0: 64 75 72 65 20 75 73 65 64 20 77 68 65 6e 20 73  dure used when s
05b0: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 69 73 0a  qlite_exec() is.
05c0: 2a 2a 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  ** invoked with 
05d0: 61 20 4e 55 4c 4c 20 63 61 6c 6c 62 61 63 6b 20  a NULL callback 
05e0: 70 6f 69 6e 74 65 72 2e 20 20 49 66 20 77 65 20  pointer.  If we 
05f0: 70 61 73 73 20 61 20 4e 55 4c 4c 20 63 61 6c 6c  pass a NULL call
0600: 62 61 63 6b 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  back.** pointer 
0610: 69 6e 74 6f 20 73 71 6c 69 74 65 56 64 62 65 45  into sqliteVdbeE
0620: 78 65 63 28 29 20 69 74 20 77 69 6c 6c 20 72 65  xec() it will re
0630: 74 75 72 6e 20 61 74 20 65 76 65 72 79 20 4f 50  turn at every OP
0640: 5f 43 61 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 77 68  _Callback,.** wh
0650: 69 63 68 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  ich we do not wa
0660: 6e 74 20 69 74 20 74 6f 20 64 6f 2e 20 20 53 6f  nt it to do.  So
0670: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61   we substitute a
0680: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
0690: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 69 6e  .** procedure in
06a0: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 4e 55   place of the NU
06b0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
06c0: 74 20 66 61 6b 65 43 61 6c 6c 62 61 63 6b 28 76  t fakeCallback(v
06d0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  oid *NotUsed, in
06e0: 74 20 6e 2c 20 63 68 61 72 20 2a 2a 61 7a 31 2c  t n, char **az1,
06f0: 20 63 68 61 72 20 2a 2a 61 7a 32 29 7b 0a 20 20   char **az2){.  
0700: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
0710: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0720: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0730: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0740: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0750: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
0760: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
0770: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
0780: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0790: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
07a0: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
07b0: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
07c0: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
07d0: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
07e0: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
07f0: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0800: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0810: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0820: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
0830: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
0840: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0850: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0860: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0870: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0880: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0890: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
08a0: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
08b0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
08c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
08d0: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
08e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
08f0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
0900: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
0910: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
0920: 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68  d*,int,char**,ch
0930: 61 72 2a 2a 29 3b 0a 0a 20 20 69 66 28 20 73 71  ar**);..  if( sq
0940: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
0950: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  ed ) return;.  x
0960: 43 61 6c 6c 62 61 63 6b 20 3d 20 70 50 61 72 73  Callback = pPars
0970: 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  e->xCallback;.  
0980: 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 3d 3d 30  if( xCallback==0
0990: 20 26 26 20 70 50 61 72 73 65 2d 3e 75 73 65 43   && pParse->useC
09a0: 61 6c 6c 62 61 63 6b 20 29 20 78 43 61 6c 6c 62  allback ) xCallb
09b0: 61 63 6b 20 3d 20 66 61 6b 65 43 61 6c 6c 62 61  ack = fakeCallba
09c0: 63 6b 3b 0a 20 20 69 66 28 20 76 20 26 26 20 70  ck;.  if( v && p
09d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
09e0: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
09f0: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0a00: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0a10: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0a20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   0;.    sqliteVd
0a30: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
0a40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
0a50: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 78 43  eMakeReady(v, xC
0a60: 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73 65 2d  allback, pParse-
0a70: 3e 70 41 72 67 2c 20 70 50 61 72 73 65 2d 3e 65  >pArg, pParse->e
0a80: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 69 66 28  xplain);.    if(
0a90: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
0aa0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 69 66  back ){.      if
0ab0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
0ac0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
0ad0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69 73 74  = sqliteVdbeList
0ae0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  (v);.        db-
0af0: 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64  >next_cookie = d
0b00: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
0b10: 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 7d  _cookie;.      }
0b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
0b30: 6c 69 74 65 56 64 62 65 45 78 65 63 28 76 29 3b  liteVdbeExec(v);
0b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
0b50: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 46 69  c = sqliteVdbeFi
0b60: 6e 61 6c 69 7a 65 28 76 2c 20 26 70 50 61 72 73  nalize(v, &pPars
0b70: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0b80: 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72     if( rc ) pPar
0b90: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0ba0: 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20    pParse->pVdbe 
0bb0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 72 73  = 0;.      pPars
0bc0: 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
0bd0: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73    if( rc ) pPars
0be0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d  e->nErr++;.    }
0bf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
0c00: 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d  se->rc = pParse-
0c10: 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45  >nErr ? SQLITE_E
0c20: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
0c30: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  NE;.    }.    pP
0c40: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
0c50: 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  t = 0;.    pPars
0c60: 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65  e->schemaVerifie
0c70: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 0;.  }else i
0c80: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61  f( pParse->useCa
0c90: 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
0ca0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
0cb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
0cc0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
0cd0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
0ce0: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
0cf0: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
0d00: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
0d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
0d20: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
0d30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
0d40: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
0d50: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
0d60: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
0d70: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74   name.** of that
0d80: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
0d90: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
0da0: 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  d..*/.Table *sql
0db0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  iteFindTable(sql
0dc0: 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  ite *db, const c
0dd0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
0de0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
0df0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
0e00: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
0e10: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0e20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
0e30: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
0e40: 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63   : i;   /* Searc
0e50: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
0e60: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
0e70: 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71  atabase!=0 && sq
0e80: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 44 61 74  liteStrICmp(zDat
0e90: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
0ea0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
0eb0: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
0ec0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
0ed0: 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c  >aDb[j].tblHash,
0ee0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
0ef0: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66  Name)+1);.    if
0f00: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
0f10: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0f20: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
0f30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
0f40: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
0f50: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
0f60: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
0f70: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
0f80: 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  t index..** Retu
0f90: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0fa0: 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  ound..*/.Index *
0fb0: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
0fc0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
0fd0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
0fe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
0ff0: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
1000: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1010: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1020: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
1030: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
1040: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
1050: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
1060: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  /.    if( zDb &&
1070: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
1080: 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  Db, db->aDb[j].z
1090: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
10a0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
10b0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
10c0: 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e  b[j].idxHash, zN
10d0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
10e0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
10f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1100: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1110: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1120: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1130: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1140: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1150: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1160: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1170: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1180: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1190: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
11a0: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
11b0: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
11c0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
11d0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
11e0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
11f0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
1200: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
1210: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1220: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1230: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
1240: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
1250: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
1260: 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  ld;..  assert( d
1270: 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65  b!=0 && p->zName
1280: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
1290: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
12a0: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
12b0: 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].idxHash, p->zN
12c0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
12e0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
12f0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c  1, 0);.  if( pOl
1300: 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20  d!=0 && pOld!=p 
1310: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  ){.    sqliteHas
1320: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
1330: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
1340: 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pOld->zName,. 
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d      strlen(pOld-
1370: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29  >zName)+1, pOld)
1380: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1390: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
13a0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
13b0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
13c0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
13d0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
13e0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
13f0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
1400: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
1410: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
1420: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
1430: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
1440: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1450: 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66  x *pIndex){.  if
1460: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
1470: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
1480: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
1490: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
14a0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
14b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
14c0: 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  ex *p;.    for(p
14d0: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
14e0: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
14f0: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
1500: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
1510: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e    if( p && p->pN
1520: 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ext==pIndex ){. 
1530: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
1540: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1550: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1560: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
1570: 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a   pIndex);.}../*.
1580: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
1590: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
15a0: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
15b0: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
15c0: 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  f.** database co
15d0: 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
15e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15f0: 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d  d to reclaim mem
1600: 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68  ory.** before th
1610: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f  e connection clo
1620: 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f  ses.  It is also
1630: 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61   called during a
1640: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20   rollback.** if 
1650: 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d  there were schem
1660: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
1670: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1680: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1690: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
16a0: 65 6d 61 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  ema(sqlite *db){
16b0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
16c0: 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31  em;.  Hash temp1
16d0: 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a  ;.  Hash temp2;.
16e0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
16f0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1700: 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
1710: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
1720: 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44 62  .    temp1 = pDb
1730: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 74  ->tblHash;.    t
1740: 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69 67  emp2 = pDb->trig
1750: 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hash;.    sqlite
1760: 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74  HashInit(&pDb->t
1770: 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  rigHash, SQLITE_
1780: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
1790: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 43  .    sqliteHashC
17a0: 6c 65 61 72 28 26 70 44 62 2d 3e 61 46 4b 65 79  lear(&pDb->aFKey
17b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  );.    sqliteHas
17c0: 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78  hClear(&pDb->idx
17d0: 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70  Hash);.    for(p
17e0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
17f0: 69 72 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45  irst(&temp2); pE
1800: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
1810: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
1820: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
1830: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c   *pTrigger = sql
1840: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
1850: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1860: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54  DeleteTrigger(pT
1870: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  rigger);.    }. 
1880: 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65     sqliteHashCle
1890: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20  ar(&temp2);.    
18a0: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
18b0: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51  pDb->tblHash, SQ
18c0: 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47  LITE_HASH_STRING
18d0: 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45  , 0);.    for(pE
18e0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
18f0: 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c  rst(&temp1); pEl
1900: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
1910: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
1920: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1930: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
1940: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
1950: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
1960: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
1970: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1980: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31  HashClear(&temp1
1990: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
19a0: 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49  gs &= ~(SQLITE_I
19b0: 6e 69 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54  nitialized|SQLIT
19c0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
19d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19f0: 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  d whenever a rol
1a00: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49  lback occurs.  I
1a10: 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20  f there were.** 
1a20: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
1a30: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
1a40: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68  ction, then we h
1a50: 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  ave to reset the
1a60: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
1a70: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c  h tables and rel
1a80: 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69  oad them from di
1a90: 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sk..*/.void sqli
1aa0: 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  teRollbackIntern
1ab0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
1ac0: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d   *db){.  if( db-
1ad0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1ae0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
1af0: 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74  .    sqliteReset
1b00: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
1b10: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
1b20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b30: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
1b40: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
1b50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
1b60: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
1b70: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
1b80: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65   db->aDb[0].sche
1b90: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1ba0: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64  next_cookie;.  d
1bb0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1bc0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
1bd0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  s;.}../*.** Remo
1be0: 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61  ve the memory da
1bf0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ta structures as
1c00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1c10: 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65  e given.** Table
1c20: 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  .  No changes ar
1c30: 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62  e made to disk b
1c40: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
1c50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c60: 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20  ne just deletes 
1c70: 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
1c80: 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  re.  It does not
1c90: 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74   unlink.** the t
1ca0: 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74  able data struct
1cb0: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ure from the has
1cc0: 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f  h table.  Nor do
1cd0: 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20  es it remove.** 
1ce0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f  foreign keys fro
1cf0: 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b  m the sqlite.aFK
1d00: 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ey hash table.  
1d10: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
1d20: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
1d30: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
1d40: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
1d50: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
1d60: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
1d70: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   table..**.** In
1d80: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
1d90: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
1da0: 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  are unlinked fro
1db0: 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61  m the "db".** da
1dc0: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
1dd0: 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62  db!=NULL.  If db
1de0: 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20  ==NULL, indices 
1df0: 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74  attached to.** t
1e00: 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c  he table are del
1e10: 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  eted, but it is 
1e20: 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76  assumed they hav
1e30: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  e already been.*
1e40: 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76  * unlinked..*/.v
1e50: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
1e60: 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62  Table(sqlite *db
1e70: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
1e80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64  {.  int i;.  Ind
1e90: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
1ea0: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
1eb0: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a  y, *pNextFKey;..
1ec0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
1ed0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
1ee0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
1ef0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1f00: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
1f10: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
1f20: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
1f30: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1f40: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
1f50: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
1f60: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
1f70: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61  pIndex->iDb==pTa
1f80: 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61  ble->iDb || (pTa
1f90: 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70  ble->iDb==0 && p
1fa0: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29  Index->iDb==1) )
1fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
1fc0: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
1fd0: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
1fe0: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
1ff0: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
2000: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
2010: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
2020: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
2030: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
2040: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
2050: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
2060: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
2070: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
2080: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
2090: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
20a0: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
20b0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
20c0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
20d0: 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ->iDb<db->nDb );
20e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
20f0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
2100: 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62  >aDb[pTable->iDb
2110: 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20  ].aFKey,.       
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
2140: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
2150: 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a  o)+1)!=pFKey );.
2160: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2170: 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FKey);.  }..  /*
2180: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
2190: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
21a0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  lf..  */.  for(i
21b0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
21c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
21d0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
21e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
21f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2200: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2210: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
2220: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2230: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20  Col[i].zType);. 
2240: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
2250: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
2260: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2270: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71  ble->aCol);.  sq
2280: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
2290: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
22a0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
22b0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
22c0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
22d0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
22e0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
22f0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
2300: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
2310: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
2320: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
2330: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 73 74  eign keys..*/.st
2340: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2350: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
2360: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
2370: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61   Table *p){.  Ta
2380: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 46 4b 65  ble *pOld;.  FKe
2390: 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20  y *pF1, *pF2;.  
23a0: 69 6e 74 20 69 20 3d 20 70 2d 3e 69 44 62 3b 0a  int i = p->iDb;.
23b0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
23c0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  );.  pOld = sqli
23d0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
23e0: 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c 48 61 73 68  ->aDb[i].tblHash
23f0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
2400: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
2410: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  0);.  assert( pO
2420: 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70  ld==0 || pOld==p
2430: 20 29 3b 0a 20 20 66 6f 72 28 70 46 31 3d 70 2d   );.  for(pF1=p-
2440: 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31  >pFKey; pF1; pF1
2450: 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pF1->pNextFrom)
2460: 7b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20  {.    int nTo = 
2470: 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29  strlen(pF1->zTo)
2480: 20 2b 20 31 3b 0a 20 20 20 20 70 46 32 20 3d 20   + 1;.    pF2 = 
2490: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
24a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79  db->aDb[i].aFKey
24b0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  , pF1->zTo, nTo)
24c0: 3b 0a 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70  ;.    if( pF2==p
24d0: 46 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  F1 ){.      sqli
24e0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
24f0: 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20  ->aDb[i].aFKey, 
2500: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  pF1->zTo, nTo, p
2510: 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20  F1->pNextTo);.  
2520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
2530: 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32  hile( pF2 && pF2
2540: 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29  ->pNextTo!=pF1 )
2550: 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74  { pF2=pF2->pNext
2560: 54 6f 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  To; }.      if( 
2570: 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pF2 ){.        p
2580: 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46  F2->pNextTo = pF
2590: 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20  1->pNextTo;.    
25a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
25b0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
25c0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
25d0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  ** Construct the
25e0: 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20   name of a user 
25f0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66  table or index f
2600: 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a  rom a token..**.
2610: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
2620: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74   the name is obt
2630: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2640: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
2650: 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  st.** be freed b
2660: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2670: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
2680: 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65  *sqliteTableName
2690: 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20  FromToken(Token 
26a0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
26b0: 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  *zName = sqliteS
26c0: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
26d0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71   pName->n);.  sq
26e0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d  liteDequote(zNam
26f0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61  e);.  return zNa
2700: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  me;.}../*.** Gen
2710: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6f 70  erate code to op
2720: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
2730: 74 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te master table.
2740: 20 20 54 68 65 20 74 61 62 6c 65 0a 2a 2a 20 6f    The table.** o
2750: 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 53 51  pened will be SQ
2760: 4c 49 54 45 5f 4d 41 53 54 45 52 20 66 6f 72 20  LITE_MASTER for 
2770: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
2780: 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  s and .** SQLITE
2790: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 66 6f 72  _TEMP_MASTER for
27a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
27b0: 73 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  s.  The table is
27c0: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 63 75   opened.** on cu
27d0: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
27e0: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
27f0: 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69  Table(Vdbe *v, i
2800: 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 73 71  nt isTemp){.  sq
2810: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2820: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54   OP_Integer, isT
2830: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  emp, 0);.  sqlit
2840: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2850: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 32  _OpenWrite, 0, 2
2860: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  );.}../*.** Begi
2870: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
2880: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
2890: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
28a0: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
28b0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
28c0: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
28d0: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
28e0: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
28f0: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
2900: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2910: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
2920: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
2930: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
2940: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
2950: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
2960: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
2970: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a  le name.  The.**
2980: 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73   pStart token is
2990: 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20   the CREATE and 
29a0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62  pName is the tab
29b0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73  le name.  The is
29c0: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
29d0: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
29e0: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
29f0: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
2a00: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
2a10: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
2a20: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
2a30: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
2a40: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
2a50: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
2a60: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
2a70: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
2a80: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
2a90: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
2aa0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
2ab0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
2ac0: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
2ad0: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
2ae0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
2af0: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
2b00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2b10: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
2b20: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
2b30: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
2b40: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2b50: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
2b60: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
2b70: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
2b80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
2b90: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2ba0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 45  ent, the sqliteE
2bb0: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
2bc0: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
2bd0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
2be0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
2bf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
2c00: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
2c10: 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 0a 20  iteStartTable(. 
2c20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2c30: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
2c40: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
2c50: 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65  pStart,   /* The
2c60: 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20   "CREATE" token 
2c70: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
2c80: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
2c90: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 74   table or view t
2ca0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 69 6e  o create */.  in
2cb0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
2cc0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2cd0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
2ce0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20 20  /.  int isView  
2cf0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d00: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
2d10: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
2d20: 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70  able;.  Index *p
2d30: 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  Idx;.  char *zNa
2d40: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  me;.  sqlite *db
2d50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2d60: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 70 50 61   Vdbe *v;..  pPa
2d70: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
2d80: 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e   = *pStart;.  zN
2d90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
2da0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
2db0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
2dc0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
2dd0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 44    if( pParse->iD
2de0: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
2df0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
2e00: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
2e10: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
2e20: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
2e30: 65 6d 70 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  emp );.  if( sql
2e40: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
2e50: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
2e60: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
2e70: 28 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a  (isTemp), 0) ){.
2e80: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
2e90: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
2ea0: 6e 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 69  n;.  }.  {.    i
2eb0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  nt code;.    if(
2ec0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
2ed0: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
2ee0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
2ef0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
2f00: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
2f10: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
2f20: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
2f30: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
2f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f50: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
2f60: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
2f70: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
2f80: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
2f90: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
2fa0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
2fb0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
2fc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
2fd0: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
2fe0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
2ff0: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
3000: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3010: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
3020: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
3030: 0a 20 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  . ..  /* Before 
3040: 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65  trying to create
3050: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
3060: 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  le, make sure th
3070: 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a  e Btree for.  **
3080: 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61   holding tempora
3090: 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65  ry tables is ope
30a0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  n..  */.  if( is
30b0: 54 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b  Temp && db->aDb[
30c0: 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
30d0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
30e0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
30f0: 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28 30 2c  liteBtreeOpen(0,
3100: 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26   0, MAX_PAGES, &
3110: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
3120: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
3130: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3140: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3150: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3160: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
3170: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
3180: 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
3190: 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
31a0: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
31b0: 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  les", 0);.      
31c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
31d0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
31e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
31f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
3200: 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20  nTrans ){.      
3210: 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  rc = sqliteBtree
3220: 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61  BeginTrans(db->a
3230: 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
3240: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3250: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
3260: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3270: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3280: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
3290: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
32a0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
32b0: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
32c0: 62 61 73 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a  base file", 0);.
32d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
32e0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
32f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
3300: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3310: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
3320: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
3330: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
3340: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
3350: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
3360: 6c 65 20 6e 61 6d 65 2e 20 20 49 73 73 75 65 20  le name.  Issue 
3370: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
3380: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   if it does..  *
3390: 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 61 72 65  *.  ** If we are
33a0: 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20   re-reading the 
33b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
33c0: 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 61  ble because of a
33d0: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61   schema.  ** cha
33e0: 6e 67 65 20 61 6e 64 20 61 20 6e 65 77 20 70 65  nge and a new pe
33f0: 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73  rmanent table is
3400: 20 66 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d   found whose nam
3410: 65 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a  e collides with.
3420: 20 20 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67    ** an existing
3430: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3440: 2c 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e  , that is not an
3450: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70   error..  */.  p
3460: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69  Table = sqliteFi
3470: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
3480: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 61  e, 0);.  if( pTa
3490: 62 6c 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c  ble!=0 && (pTabl
34a0: 65 2d 3e 69 44 62 3d 3d 69 73 54 65 6d 70 20 7c  e->iDb==isTemp |
34b0: 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  | !pParse->initF
34c0: 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  lag) ){.    sqli
34d0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
34e0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
34f0: 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d  table ", 0, pNam
3500: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a  e->z, pName->n,.
3510: 20 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64          " alread
3520: 79 20 65 78 69 73 74 73 22 2c 20 30 2c 20 30 29  y exists", 0, 0)
3530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3540: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61  (zName);.    pPa
3550: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3560: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
3570: 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74  f( (pIdx = sqlit
3580: 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
3590: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 0a  Name, 0))!=0 &&.
35a0: 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 2d            (pIdx-
35b0: 3e 69 44 62 3d 3d 30 20 7c 7c 20 21 70 50 61 72  >iDb==0 || !pPar
35c0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b  se->initFlag) ){
35d0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
35e0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
35f0: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
3600: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
3610: 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20  x named ", .    
3620: 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20     zName, 0);.  
3630: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
3640: 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  me);.    pParse-
3650: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
3660: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
3670: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3680: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
3690: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
36a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
36b0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
36c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
36d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
36e0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
36f0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
3700: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3710: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
3720: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
3730: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
3740: 6c 65 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d 70  le->iDb = isTemp
3750: 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69   ? 1 : pParse->i
3760: 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  Db;.  if( pParse
3770: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71  ->pNewTable ) sq
3780: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
3790: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
37a0: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
37b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
37c0: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  able;..  /* Begi
37d0: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
37e0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
37f0: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
3800: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
3810: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
3820: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
3830: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
3840: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
3850: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
3860: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
3870: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
3880: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
3890: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
38a0: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
38b0: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
38c0: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
38d0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
38e0: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
38f0: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
3900: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
3910: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
3920: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
3930: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
3940: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
3950: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
3960: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
3970: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
3980: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
3990: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
39a0: 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   (v = sqliteGetV
39b0: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
39c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67  ){.    sqliteBeg
39d0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
39e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65  (pParse, 0, isTe
39f0: 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  mp);.    if( !is
3a00: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
3a10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3a20: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
3a30: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
3a40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3a50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
3a60: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a  tCookie, 0, 1);.
3a70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3a80: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
3a90: 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  v, isTemp);.    
3aa0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3ab0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
3ac0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
3ad0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3ae0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
3af0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3b00: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
3b10: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3b20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3b30: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
3b40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3b50: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
3b60: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
3b70: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
3b80: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
3b90: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
3ba0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
3bb0: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
3bc0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
3bd0: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
3be0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
3bf0: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
3c00: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
3c10: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
3c20: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
3c30: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
3c40: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
3c50: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
3c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43  .void sqliteAddC
3c70: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
3c80: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
3c90: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
3ca0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
3cb0: 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  *z = 0;.  Column
3cc0: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
3cd0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
3ce0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
3cf0: 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53  n;.  sqliteSetNS
3d00: 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d  tring(&z, pName-
3d10: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
3d20: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
3d30: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44  eturn;.  sqliteD
3d40: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72  equote(z);.  for
3d50: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
3d60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
3d70: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20  qliteStrICmp(z, 
3d80: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
3d90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
3da0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
3db0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
3dc0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
3dd0: 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30 29  n name: ", z, 0)
3de0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
3df0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nErr++;.      sq
3e00: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
3e10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
3e20: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
3e30: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
3e40: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
3e50: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
3e60: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
3e70: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
3e80: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
3e90: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
3ea0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
3eb0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
3ec0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
3ed0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
3ee0: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
3ef0: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
3f00: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
3f10: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
3f20: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
3f30: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
3f40: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
3f50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3f60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3f70: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
3f80: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
3f90: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
3fa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
3fb0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
3fc0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
3fd0: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
3fe0: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
3ff0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
4000: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
4010: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
4020: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
4030: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
4040: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4050: 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  eAddNotNull(Pars
4060: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
4070: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
4080: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
4090: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
40a0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
40b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
40c0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
40d0: 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69  i>=0 ) p->aCol[i
40e0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  ].notNull = onEr
40f0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ror;.}../*.** Th
4100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4110: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
4120: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
4130: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
4140: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
4150: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4160: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
4170: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
4180: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
4190: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
41a0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
41b0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
41c0: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
41d0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
41e0: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
41f0: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
4200: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
4210: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
4220: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
4230: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
4240: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
4250: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
4260: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
4270: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
4280: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
4290: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  */ .void sqliteA
42a0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
42b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
42c0: 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e  n *pFirst, Token
42d0: 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c   *pLast){.  Tabl
42e0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  e *p;.  int i, j
42f0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61  ;.  int n;.  cha
4300: 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f  r *z, **pz;.  Co
4310: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
4320: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
4330: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
4340: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
4350: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
4360: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  0 ) return;.  pC
4370: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  ol = &p->aCol[i]
4380: 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e  ;.  pz = &pCol->
4390: 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61  zType;.  n = pLa
43a0: 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61  st->n + Addr(pLa
43b0: 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46  st->z) - Addr(pF
43c0: 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69  irst->z);.  sqli
43d0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
43e0: 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30   pFirst->z, n, 0
43f0: 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20  );.  z = *pz;.  
4400: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
4410: 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  n;.  for(i=j=0; 
4420: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
4430: 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  int c = z[i];.  
4440: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
4450: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4460: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d   z[j++] = c;.  }
4470: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 69  .  z[j] = 0;.  i
4480: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
4490: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
44a0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f  .    pCol->sortO
44b0: 72 64 65 72 20 3d 20 73 71 6c 69 74 65 43 6f 6c  rder = sqliteCol
44c0: 6c 61 74 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a  lateType(z, n);.
44d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
44e0: 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53  l->sortOrder = S
44f0: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
4500: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67  }.}../*.** The g
4510: 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68  iven token is th
4520: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
4530: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  for the last col
4540: 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  umn added to.** 
4550: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
4560: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
4570: 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e  uction.  If "min
4580: 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c  usFlag" is true,
4590: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
45a0: 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73   value token was
45b0: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
45c0: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
45d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
45e0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
45f0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
4600: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
4610: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
4620: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4630: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4640: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
4650: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
4660: 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20  oken *pVal, int 
4670: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61  minusFlag){.  Ta
4680: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
4690: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20  .  char **pz;.  
46a0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
46b0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
46c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
46d0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
46e0: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
46f0: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  pz = &p->aCol[i]
4700: 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69  .zDflt;.  if( mi
4710: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nusFlag ){.    s
4720: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
4730: 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c  pz, "-", 1, pVal
4740: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
4750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
4760: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
4770: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
4780: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
4790: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
47a0: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
47b0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
47c0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
47d0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
47e0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
47f0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
4800: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
4810: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
4820: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
4830: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
4840: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
4850: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
4860: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
4870: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
4880: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
4890: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
48a0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
48b0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
48c0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
48d0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
48e0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
48f0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
4900: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
4910: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
4920: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
4930: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
4940: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
4950: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
4960: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
4970: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
4980: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
4990: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
49a0: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
49b0: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
49c0: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
49d0: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
49e0: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
49f0: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
4a00: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
4a10: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
4a20: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
4a30: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
4a40: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4a50: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
4a60: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
4a70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4a80: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
4a90: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
4aa0: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
4ab0: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
4ac0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
4ad0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
4ae0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
4af0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
4b00: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
4b10: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
4b20: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
4b30: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
4b40: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4b50: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
4b60: 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  teAddPrimaryKey(
4b70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
4b80: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  dList *pList, in
4b90: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
4ba0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
4bb0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
4bc0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
4bd0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
4be0: 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  1;.  if( pTab==0
4bf0: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
4c00: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
4c10: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
4c20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
4c30: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
4c40: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
4c50: 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   \"", pTab->zNam
4c60: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22 20  e, .        "\" 
4c70: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
4c80: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
4c90: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
4ca0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
4cb0: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
4cc0: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68  t;.  }.  pTab->h
4cd0: 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  asPrimKey = 1;. 
4ce0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
4cf0: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
4d00: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 7d 65  ->nCol - 1;.  }e
4d10: 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  lse if( pList->n
4d20: 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  Id==1 ){.    for
4d30: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
4d40: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
4d50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
4d60: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
4d70: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[0].zName, pT
4d80: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
4d90: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4db0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
4dc0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
4dd0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
4de0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
4df0: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  pe;.  }.  if( pP
4e00: 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66  arse->db->file_f
4e10: 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20 20  ormat>=1 && .   
4e20: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 26 26          zType &&
4e30: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
4e40: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
4e50: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ==0 ){.    pTab-
4e60: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
4e70: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
4e80: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65   = onError;.  }e
4e90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 43  lse{.    sqliteC
4ea0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
4eb0: 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  e, 0, 0, pList, 
4ec0: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 30  onError, 0, 0, 0
4ed0: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
4ee0: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
4ef0: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
4f00: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
4f10: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
4f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4f30: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
4f40: 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 20 67  collating type g
4f50: 69 76 65 6e 20 61 20 74 79 70 65 20 6e 61 6d 65  iven a type name
4f60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
4f70: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 65  ation type is te
4f80: 78 74 20 28 53 51 4c 49 54 45 5f 53 4f 5f 54 45  xt (SQLITE_SO_TE
4f90: 58 54 29 20 69 66 20 74 68 65 20 74 79 70 65 0a  XT) if the type.
4fa0: 2a 2a 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73  ** name contains
4fb0: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 73   the character s
4fc0: 74 72 65 61 6d 20 22 74 65 78 74 22 20 6f 72 20  tream "text" or 
4fd0: 22 62 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22 63 6c  "blob" or.** "cl
4fe0: 6f 62 22 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ob".  Any other 
4ff0: 74 79 70 65 20 6e 61 6d 65 20 69 73 20 63 6f 6c  type name is col
5000: 6c 61 74 65 64 20 61 73 20 6e 75 6d 65 72 69 63  lated as numeric
5010: 0a 2a 2a 20 28 53 51 4c 49 54 45 5f 53 4f 5f 4e  .** (SQLITE_SO_N
5020: 55 4d 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  UM)..*/.int sqli
5030: 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 63 6f  teCollateType(co
5040: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
5050: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69   int nType){.  i
5060: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5070: 20 69 3c 6e 54 79 70 65 2d 31 3b 20 69 2b 2b 29   i<nType-1; i++)
5080: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 54  {.    switch( zT
5090: 79 70 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ype[i] ){.      
50a0: 63 61 73 65 20 27 62 27 3a 0a 20 20 20 20 20 20  case 'b':.      
50b0: 63 61 73 65 20 27 42 27 3a 20 7b 0a 20 20 20 20  case 'B': {.    
50c0: 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65 2d      if( i<nType-
50d0: 33 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49  3 && sqliteStrNI
50e0: 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 62  Cmp(&zType[i],"b
50f0: 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20  lob",4)==0 ){.  
5100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
5110: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
5120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5140: 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a        case 'c':.
5150: 20 20 20 20 20 20 63 61 73 65 20 27 43 27 3a 20        case 'C': 
5160: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
5170: 6e 54 79 70 65 2d 33 20 26 26 20 28 73 71 6c 69  nType-3 && (sqli
5180: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70  teStrNICmp(&zTyp
5190: 65 5b 69 5d 2c 22 63 68 61 72 22 2c 34 29 3d 3d  e[i],"char",4)==
51a0: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0 ||.           
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
51d0: 7a 54 79 70 65 5b 69 5d 2c 22 63 6c 6f 62 22 2c  zType[i],"clob",
51e0: 34 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 29  4)==0).        )
51f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5200: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
5210: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
5220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5230: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
5240: 78 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27  x':.      case '
5250: 58 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  X': {.        if
5260: 28 20 69 3e 3d 32 20 26 26 20 73 71 6c 69 74 65  ( i>=2 && sqlite
5270: 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b  StrNICmp(&zType[
5280: 69 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d  i-2],"text",4)==
5290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
52a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
52b0: 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TEXT;.        }.
52c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
52d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
52e0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
52f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5300: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5310: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  n SQLITE_SO_NUM;
5320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5330: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5340: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
5350: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
5360: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
5370: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5380: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 43  statement.  A "C
5390: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 68  OLLATE" clause h
53a0: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
53b0: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
53c0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
53d0: 74 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f 72 74 4f  the Column.sortO
53e0: 72 64 65 72 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  rder on.** the c
53f0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
5400: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5410: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5420: 74 65 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  teAddCollateType
5430: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5440: 69 6e 74 20 63 6f 6c 6c 54 79 70 65 29 7b 0a 20  int collType){. 
5450: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
5460: 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70   i;.  if( (p = p
5470: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5480: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
5490: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
54a0: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e    if( i>=0 ) p->
54b0: 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  aCol[i].sortOrde
54c0: 72 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 7d 0a  r = collType;.}.
54d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77  ./*.** Come up w
54e0: 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d  ith a new random
54f0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
5500: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d  chema cookie.  M
5510: 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20  ake sure.** the 
5520: 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66  new value is dif
5530: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
5540: 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  old..**.** The s
5550: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
5560: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
5570: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
5580: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
5590: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
55a0: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
55b0: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
55c0: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
55d0: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
55e0: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
55f0: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
5600: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
5610: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
5620: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
5630: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
5640: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
5650: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
5660: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
5670: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
5680: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
5690: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
56a0: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
56b0: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
56c0: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
56d0: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
56e0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
56f0: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
5700: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
5710: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
5720: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
5730: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
5740: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
5750: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
5760: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
5770: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
5780: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
5790: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
57a0: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
57b0: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
57c0: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
57d0: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
57e0: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
57f0: 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 56  ie(sqlite *db, V
5800: 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 64  dbe *v){.  if( d
5810: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d  b->next_cookie==
5820: 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d  db->aDb[0].schem
5830: 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  a_cookie ){.    
5840: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20  db->next_cookie 
5850: 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68  = db->aDb[0].sch
5860: 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c  ema_cookie + sql
5870: 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29 20  iteRandomByte() 
5880: 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  + 1;.    db->fla
5890: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
58a0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
58b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
58c0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
58d0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20  b->next_cookie, 
58e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
58f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
5900: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a  tCookie, 0, 0);.
5910: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61    }.}../*.** Mea
5920: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
5930: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
5940: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
5950: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
5960: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
5970: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
5980: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
5990: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
59a0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
59b0: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
59c0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
59d0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
59e0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
59f0: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64  nt n;.  int need
5a00: 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72  Quote = 0;.  for
5a10: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
5a20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
5a30: 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65  ='\'' ){ n++; ne
5a40: 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d  edQuote=1; }.  }
5a50: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65  .  return n + ne
5a60: 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a  edQuote*2;.}../*
5a70: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
5a80: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
5a90: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
5aa0: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
5ab0: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
5ac0: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
5ad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
5ae0: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
5af0: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
5b00: 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69  zIdent){.  int i
5b10: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
5b20: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
5b30: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
5b40: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
5b50: 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74   !isalnum(zIdent
5b60: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
5b70: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
5b80: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
5b90: 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20  =  zIdent[j]!=0 
5ba0: 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e  || isdigit(zIden
5bb0: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
5bc0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
5bd0: 65 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  eKeywordCode(zId
5be0: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
5bf0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
5c00: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
5c10: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
5c20: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
5c30: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
5c40: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
5c50: 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a  ent[j]=='\'' ) z
5c60: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
5c70: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
5c80: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  e ) z[i++] = '\'
5c90: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
5ca0: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
5cb0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
5cc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5cd0: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
5ce0: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
5cf0: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
5d00: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
5d10: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
5d20: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
5d30: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
5d40: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
5d50: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
5d60: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
5d70: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
5d80: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
5d90: 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  mt(Table *p){.  
5da0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
5db0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
5dc0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
5dd0: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30  , *zEnd;.  n = 0
5de0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5df0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
5e00: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
5e10: 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  th(p->aCol[i].zN
5e20: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  ame);.  }.  n +=
5e30: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
5e40: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
5e50: 34 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  40 ){.    zSep =
5e60: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
5e70: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
5e80: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
5e90: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
5ea0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
5eb0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
5ec0: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
5ed0: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
5ee0: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
5ef0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
5f00: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
5f10: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5f20: 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70   strcpy(zStmt, p
5f30: 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45 41  ->iDb==1 ? "CREA
5f40: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20  TE TEMP TABLE " 
5f50: 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  : "CREATE TABLE 
5f60: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
5f70: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
5f80: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
5f90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
5fa0: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
5fb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
5fc0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ol; i++){.    st
5fd0: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
5fe0: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
5ff0: 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d  strlen(&zStmt[k]
6000: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
6010: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
6020: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
6030: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
6040: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53    }.  strcpy(&zS
6050: 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20  tmt[k], zEnd);. 
6060: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
6070: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6080: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
6090: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
60a0: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
60b0: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
60c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
60d0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
60e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
60f0: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
6100: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
6110: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
6120: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
6130: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
6140: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
6150: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
6160: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
6170: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
6180: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
6190: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
61a0: 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75  le on disk,.** u
61b0: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20  nless this is a 
61c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
61d0: 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20  or initFlag==1. 
61e0: 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d   When initFlag==
61f0: 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  1,.** it means w
6200: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
6210: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6220: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
6230: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
6240: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
6250: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
6260: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6270: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
6280: 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73  ently changes, s
6290: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
62a0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
62b0: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
62c0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
62d0: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
62e0: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
62f0: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
6300: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
6310: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
6320: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
6330: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
6340: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
6350: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
6360: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
6370: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
6380: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
6390: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
63a0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
63b0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
63c0: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
63d0: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
63e0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
63f0: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
6400: 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20  eEndTable(Parse 
6410: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
6420: 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53  pEnd, Select *pS
6430: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
6440: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *p;.  sqlite *db
6450: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
6460: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
6470: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
6480: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
6490: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
64a0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
64b0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
64c0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
64d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
64e0: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
64f0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72   is generated fr
6500: 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65  om a SELECT, the
6510: 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a  n construct the.
6520: 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c    ** list of col
6530: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65 78  umns and the tex
6540: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
6550: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65    */.  if( pSele
6560: 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ct ){.    Table 
6570: 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74  *pSelTab = sqlit
6580: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
6590: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
65a0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20  elect);.    if( 
65b0: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
65c0: 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  urn;.    assert(
65d0: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
65e0: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
65f0: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
6600: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
6610: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65  b->aCol;.    pSe
6620: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
6630: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
6640: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
6650: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  eDeleteTable(0, 
6660: 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20  pSelTab);.  }.. 
6670: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
6680: 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e  lag is 1 it mean
6690: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
66a0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
66b0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
66c0: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
66d0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
66e0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
66f0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
6700: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
6710: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
6720: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
6730: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
6740: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
6750: 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e  he pParse->newTn
6760: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
6770: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
6780: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
6790: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
67a0: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
67b0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
67c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
67d0: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e  tFlag ){.    p->
67e0: 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tnum = pParse->n
67f0: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
6800: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
6810: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
6820: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
6830: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
6840: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
6850: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
6860: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
6870: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
6880: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  r.  ** for the n
6890: 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73  ew table entry s
68a0: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
68b0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
68c0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
68d0: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
68e0: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
68f0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
6900: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
6910: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
6920: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
6930: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
6940: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
6950: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
6960: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
6970: 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  *v;..    v = sql
6980: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
6990: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
69a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
69b0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
69c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
69d0: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
69e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
69f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
6a00: 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69  teTable, 0, p->i
6a10: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
6a20: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6a30: 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 26 70 2d   -1, (char *)&p-
6a40: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
6a50: 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  R);.    }else{. 
6a60: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
6a70: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  /.      sqliteVd
6a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6a90: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
6aa0: 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20    }.    p->tnum 
6ab0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  = 0;.    sqliteV
6ac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6ad0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
6ae0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6af0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
6b00: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
6b10: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
6b20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6b30: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 74  angeP3(v, -1, "t
6b40: 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49 43  able", P3_STATIC
6b50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6b60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6b70: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 76  angeP3(v, -1, "v
6b80: 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29  iew", P3_STATIC)
6b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6ba0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6bb0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
6bc0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
6bd0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
6be0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
6bf0: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
6c00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6c10: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
6c20: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6c30: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a  geP3(v, -1, p->z
6c40: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
6c50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6c60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
6c70: 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   4, 0);.    sqli
6c80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6c90: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
6ca0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
6cb0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
6cc0: 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  z = createTableS
6cd0: 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20  tmt(p);.      n 
6ce0: 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20  = z ? strlen(z) 
6cf0: 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  : 0;.      sqlit
6d00: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6d10: 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
6d20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
6d30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6d40: 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d    assert( pEnd!=
6d50: 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41  0 );.      n = A
6d60: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
6d70: 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72  ddr(pParse->sFir
6d80: 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  stToken.z) + 1;.
6d90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6da0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6db0: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
6dc0: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  ken.z, n);.    }
6dd0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6de0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
6df0: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
6e00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6e10: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
6e20: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
6e30: 28 20 21 70 2d 3e 69 44 62 20 29 7b 0a 20 20 20  ( !p->iDb ){.   
6e40: 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43     sqliteChangeC
6e50: 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20  ookie(db, v);.  
6e60: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
6e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6e80: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
6e90: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
6ea0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6eb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6ec0: 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  er, p->iDb, 0);.
6ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6ee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
6ef0: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
6f00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
6f10: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
6f20: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
6f30: 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61   pSelect, SRT_Ta
6f40: 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29  ble, 1, 0, 0, 0)
6f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6f60: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
6f70: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
6f80: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
6f90: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
6fa0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
6fb0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
6fc0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
6fd0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
6fe0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
6ff0: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  Err==0 ){.    Ta
7000: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46  ble *pOld;.    F
7010: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20  Key *pFKey;.    
7020: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
7030: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
7040: 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68  [p->iDb].tblHash
7050: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7070: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
7080: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
7090: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
70a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
70b0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
70c0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
70d0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
70e0: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
70f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7100: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
7110: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
7120: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
7130: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
7140: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
7150: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
7160: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
7170: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 48 61  extTo = sqliteHa
7180: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
7190: 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70  p->iDb].aFKey, p
71a0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b  FKey->zTo, nTo);
71b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73  .      sqliteHas
71c0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
71d0: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
71e0: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  pFKey->zTo, nTo,
71f0: 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20   pFKey);.    }. 
7200: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
7210: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
7220: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
7230: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
7240: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
7250: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
7260: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
7270: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
7280: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
7290: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
72a0: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
72b0: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
72c0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
72d0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
72e0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
72f0: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
7300: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
7310: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
7320: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
7330: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
7340: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
7350: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
7360: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
7370: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
7380: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
7390: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
73a0: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
73b0: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
73c0: 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20  t isTemp        
73d0: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
73e0: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
73f0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
7400: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
7410: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
7420: 6e 20 73 45 6e 64 3b 0a 0a 20 20 73 71 6c 69 74  n sEnd;..  sqlit
7430: 65 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  eStartTable(pPar
7440: 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d  se, pBegin, pNam
7450: 65 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  e, isTemp, 1);. 
7460: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7470: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7480: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
7490: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
74a0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
74b0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
74c0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
74d0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
74e0: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
74f0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
7500: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
7510: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
7520: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
7530: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
7540: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
7550: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
7560: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
7570: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
7580: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
7590: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
75a0: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
75b0: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
75c0: 6e 74 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29  nt sqlite_exec()
75d0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
75e0: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
75f0: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44   = sqliteSelectD
7600: 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  up(pSelect);.  s
7610: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
7620: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
7630: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
7640: 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
7650: 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  eViewGetColumnNa
7660: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
7670: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
7680: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7690: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
76a0: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
76b0: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
76c0: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
76d0: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
76e0: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
76f0: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26   sEnd.z[0]!=0 &&
7700: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
7710: 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
7720: 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
7730: 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
7740: 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d   ((int)sEnd.z) -
7750: 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b   (int)pBegin->z;
7760: 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
7770: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
7780: 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c  & (z[n-1]==';' |
7790: 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  | isspace(z[n-1]
77a0: 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  )) ){ n--; }.  s
77b0: 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
77c0: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
77d0: 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 45    /* Use sqliteE
77e0: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
77f0: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
7800: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
7810: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
7820: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
7830: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
7840: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
7850: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
7860: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
7870: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
7880: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
7890: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
78a0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
78b0: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
78c0: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
78d0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
78e0: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
78f0: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
7900: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
7910: 67 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45 72  ge in pPare->zEr
7920: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
7930: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
7940: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
7950: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
7960: 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  le){.  ExprList 
7970: 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63  *pEList;.  Selec
7980: 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65  t *pSel;.  Table
7990: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74   *pSelTab;.  int
79a0: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73   nErr = 0;..  as
79b0: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
79c0: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
79d0: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
79e0: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
79f0: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
7a00: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
7a10: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
7a20: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
7a30: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
7a40: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
7a50: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
7a60: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
7a70: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
7a80: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
7a90: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
7aa0: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
7ab0: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
7ac0: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
7ad0: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
7ae0: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
7af0: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
7b00: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
7b10: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
7b20: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
7b30: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
7b40: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
7b50: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
7b60: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
7b70: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
7b80: 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65  Actually, this e
7b90: 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70  rror is caught p
7ba0: 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f  reviously and so
7bb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
7bc0: 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  est.  ** should 
7bd0: 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75  always fail.  Bu
7be0: 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  t we will leave 
7bf0: 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74  it in place just
7c00: 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a   to be safe..  *
7c10: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
7c20: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
7c30: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
7c40: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
7c50: 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65 2d  "view ", pTable-
7c60: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
7c70: 20 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79   " is circularly
7c80: 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b 0a 20   defined", 0);. 
7c90: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7ca0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  +;.    return 1;
7cb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
7cc0: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
7cd0: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
7ce0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
7cf0: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  able names..  */
7d00: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
7d10: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a  e->pSelect ); /*
7d20: 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65   If nCol==0, the
7d30: 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65  n pTable must be
7d40: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65   a VIEW */.  pSe
7d50: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  l = pTable->pSel
7d60: 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20  ect;..  /* Note 
7d70: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
7d80: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
7d90: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
7da0: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
7db0: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
7dc0: 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20  this list.  But 
7dd0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  we will need to 
7de0: 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74  restore the list
7df0: 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74  .  ** back to it
7e00: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
7e10: 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61  guration afterwa
7e20: 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20  rds, so we save 
7e30: 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74  a copy of.  ** t
7e40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70  he original in p
7e50: 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45  EList..  */.  pE
7e60: 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c  List = pSel->pEL
7e70: 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  ist;.  pSel->pEL
7e80: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
7e90: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
7ea0: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
7eb0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
7ec0: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
7ed0: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
7ee0: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
7ef0: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
7f00: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
7f10: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
7f20: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
7f30: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
7f40: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
7f50: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
7f60: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
7f70: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
7f80: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
7f90: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
7fa0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
7fb0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
7fc0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
7fd0: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
7fe0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
7ff0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
8000: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
8010: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
8020: 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 66 6c 61  pTable->iDb].fla
8030: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e 72  gs |= SQLITE_Unr
8040: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 7d 65 6c  esetViews;.  }el
8050: 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  se{.    pTable->
8060: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45  nCol = 0;.    nE
8070: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rr++;.  }.  sqli
8080: 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  teSelectUnbind(p
8090: 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  Sel);.  sqliteEx
80a0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65  prListDelete(pSe
80b0: 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53  l->pEList);.  pS
80c0: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
80d0: 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45  ist;.  return nE
80e0: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rr;  .}../*.** C
80f0: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
8100: 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56  names from the V
8110: 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a  IEW pTable..**.*
8120: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8130: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
8140: 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c  r any other tabl
8150: 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64  e or view is mod
8160: 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69  ified..** The vi
8170: 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  ew passed into t
8180: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
8190: 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c  t depend directl
81a0: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a  y or indirectly.
81b0: 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69  ** on the modifi
81c0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61  ed or deleted ta
81d0: 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74  ble so we need t
81e0: 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20  o clear the old 
81f0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20  column.** names 
8200: 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
8210: 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e  l be recomputed.
8220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8230: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43  sqliteViewResetC
8240: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65  olumnNames(Table
8250: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
8260: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   i;.  if( pTable
8270: 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70  ==0 || pTable->p
8280: 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75  Select==0 ) retu
8290: 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  rn;.  if( pTable
82a0: 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ->nCol==0 ) retu
82b0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
82c0: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
82d0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
82e0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
82f0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
8300: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
8310: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74  e->aCol[i].zDflt
8320: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
8330: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
8340: 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  ].zType);.  }.  
8350: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
8360: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62  e->aCol);.  pTab
8370: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
8380: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
8390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
83a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
83b0: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
83c0: 57 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  W..*/.static voi
83d0: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
83e0: 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c  tAll(sqlite *db,
83f0: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
8400: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
8410: 28 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 66 6c  (db->aDb[idx].fl
8420: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 55 6e 72  ags & SQLITE_Unr
8430: 65 73 65 74 56 69 65 77 73 29 3d 3d 30 20 29 20  esetViews)==0 ) 
8440: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8450: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8460: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
8470: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
8480: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
8490: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
84a0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
84b0: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
84c0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
84d0: 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52       sqliteViewR
84e0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
84f0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
8500: 0a 20 20 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  .  db->aDb[idx].
8510: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
8520: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 7d  _UnresetViews;.}
8530: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
8540: 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61  token, look up a
8550: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74   table with that
8560: 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66   name.  If not f
8570: 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61  ound, leave.** a
8580: 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20  n error for the 
8590: 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61  parser to find a
85a0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
85b0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
85c0: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50  TableFromToken(P
85d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
85e0: 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68  ken *pTok){.  ch
85f0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62  ar *zName;.  Tab
8600: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d  le *pTab;.  zNam
8610: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
8620: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
8630: 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  k);.  if( zName=
8640: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8650: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
8660: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
8670: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  db, zName, 0);. 
8680: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
8690: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
86a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
86b0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
86c0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
86d0: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
86e0: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d  , .        pTok-
86f0: 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b  >z, pTok->n, 0);
8700: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
8710: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
8720: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
8730: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8740: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
8750: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
8760: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8770: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
8780: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
8790: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
87a0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
87b0: 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
87c0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
87d0: 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
87e0: 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ew){.  Table *pT
87f0: 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  able;.  Vdbe *v;
8800: 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73  .  int base;.  s
8810: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
8820: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
8830: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
8840: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
8850: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
8860: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
8870: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46  e = sqliteTableF
8880: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  romToken(pParse,
8890: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   pName);.  if( p
88a0: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
88b0: 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 6c  n;.  iDb = pTabl
88c0: 65 2d 3e 69 44 62 3b 0a 23 69 66 6e 64 65 66 20  e->iDb;.#ifndef 
88d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
88e0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
88f0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
8900: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
8910: 45 4c 45 54 45 2c 20 53 43 48 45 4d 41 5f 54 41  ELETE, SCHEMA_TA
8920: 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44 62 29  BLE(pTable->iDb)
8930: 2c 30 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ,0)){.    return
8940: 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 69 6e  ;.  }.  {.    in
8950: 74 20 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  t code;.    if( 
8960: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
8970: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
8980: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
8990: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
89a0: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
89b0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
89c0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
89d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
89e0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
89f0: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
8a00: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
8a10: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
8a20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8a30: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
8a40: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
8a50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8a60: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
8a70: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
8a80: 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  e, pTable->zName
8a90: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
8aa0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
8ab0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
8ac0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
8ad0: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c  TE_DELETE, pTabl
8ae0: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  e->zName, 0) ){.
8af0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8b00: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
8b10: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61   if( pTable->rea
8b20: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
8b30: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
8b40: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
8b50: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d  table ", pTable-
8b60: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
8b70: 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  " may not be dro
8b80: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  pped", 0);.    p
8b90: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
8ba0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8bb0: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
8bc0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d  Table->pSelect==
8bd0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
8be0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
8bf0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20  ->zErrMsg, "use 
8c00: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
8c10: 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a 20 20  lete table ",.  
8c20: 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d      pTable->zNam
8c30: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
8c40: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
8c50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
8c60: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
8c70: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  le->pSelect ){. 
8c80: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8c90: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8ca0: 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 56  Msg, "use DROP V
8cb0: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
8cc0: 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62  ew ",.      pTab
8cd0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
8ce0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
8cf0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
8d00: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
8d10: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
8d20: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
8d30: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
8d40: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
8d50: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
8d60: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
8d70: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
8d80: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72  static VdbeOp dr
8d90: 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20  opTable[] = {.  
8da0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
8db0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
8dc0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
8dd0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
8de0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
8df0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
8e00: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
8e10: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
8e20: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
8e30: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
8e40: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
8e50: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
8e60: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
8e70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
8e80: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
8e90: 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(7),  0},.  
8ea0: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
8eb0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
8ec0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
8ed0: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
8ee0: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
8ef0: 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   7 */.    };.   
8f00: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8f10: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
8f20: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 42  ger;.    sqliteB
8f30: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
8f40: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  on(pParse, 0, pT
8f50: 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20  able->iDb);.    
8f60: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
8f70: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d  Table(v, pTable-
8f80: 3e 69 44 62 29 3b 0a 20 20 20 20 2f 2a 20 44 72  >iDb);.    /* Dr
8f90: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
8fa0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8fb0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
8fc0: 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70  dropped */.    p
8fd0: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65  Trigger = pTable
8fe0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
8ff0: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
9000: 29 7b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  ){.      SrcList
9010: 20 2a 70 4e 6d 3b 0a 20 20 20 20 20 20 61 73 73   *pNm;.      ass
9020: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
9030: 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20  Db==pTable->iDb 
9040: 29 3b 0a 20 20 20 20 20 20 70 4e 6d 20 3d 20 73  );.      pNm = s
9050: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65  qliteSrcListAppe
9060: 6e 64 28 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  nd(0, 0, 0);.   
9070: 20 20 20 70 4e 6d 2d 3e 61 5b 30 5d 2e 7a 4e 61     pNm->a[0].zNa
9080: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
9090: 70 28 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  p(pTrigger->name
90a0: 29 3b 0a 20 20 20 20 20 20 70 4e 6d 2d 3e 61 5b  );.      pNm->a[
90b0: 30 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  0].zDatabase = s
90c0: 71 6c 69 74 65 53 74 72 44 75 70 28 64 62 2d 3e  qliteStrDup(db->
90d0: 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d  aDb[pTable->iDb]
90e0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  .zName);.      s
90f0: 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72  qliteDropTrigger
9100: 28 70 50 61 72 73 65 2c 20 70 4e 6d 2c 20 31 29  (pParse, pNm, 1)
9110: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
9120: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
9130: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20         pTrigger 
9140: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
9150: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9160: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
9170: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67   = pTable->pTrig
9180: 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ger;.      }.   
9190: 20 7d 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71   }.    base = sq
91a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
91b0: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
91c0: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
91d0: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
91e0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
91f0: 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d   base+1, pTable-
9200: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9210: 69 66 28 20 21 70 54 61 62 6c 65 2d 3e 69 44 62  if( !pTable->iDb
9220: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9230: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
9240: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
9250: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9260: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
9270: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
9280: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
9290: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
92a0: 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c  P_Destroy, pTabl
92b0: 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d  e->tnum, pTable-
92c0: 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  >iDb);.      for
92d0: 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49  (pIdx=pTable->pI
92e0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
92f0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9310: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
9320: 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  troy, pIdx->tnum
9330: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a  , pTable->iDb);.
9340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9350: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
9360: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
9370: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
9380: 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
9390: 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
93a0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a   the table..  **
93b0: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
93c0: 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   if the SQL stat
93d0: 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68  ement began with
93e0: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
93f0: 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  word,.  ** then 
9400: 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c  no changes shoul
9410: 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  d be made..  */.
9420: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
9430: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
9440: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
9450: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
9460: 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ble);.    db->fl
9470: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
9480: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
9490: 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
94a0: 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
94b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
94c0: 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73  utine constructs
94d0: 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75 69   a P3 string sui
94e0: 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f  table for an OP_
94f0: 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70  MakeIdxKey.** op
9500: 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74 68  code and adds th
9510: 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20  at P3 string to 
9520: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9530: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
9540: 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  uction.** in the
9550: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
9560: 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e 67  .  The P3 string
9570: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
9580: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a  ingle character.
9590: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ** for each colu
95a0: 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  mn in the index 
95b0: 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54  pIdx of table pT
95c0: 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75  ab.  If the colu
95d0: 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d  mn uses.** a num
95e0: 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c  eric sort order,
95f0: 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74 72   then the P3 str
9600: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 6f  ing character co
9610: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a  rresponding to.*
9620: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73  * that column is
9630: 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f   'n'.  If the co
9640: 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74  lumn uses a text
9650: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
9660: 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69  n the.** P3 stri
9670: 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65 20  ng is 't'.  See 
9680: 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  the OP_MakeIdxKe
9690: 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e  y opcode documen
96a0: 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64  tation for.** ad
96b0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
96c0: 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20  tion.  See also 
96d0: 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65 79  the sqliteAddKey
96e0: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
96f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
9700: 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65  dIdxKeyType(Vdbe
9710: 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78   *v, Index *pIdx
9720: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  ){.  char *zType
9730: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
9740: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
9750: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26  ssert( pIdx!=0 &
9760: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d  & pIdx->pTable!=
9770: 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  0 );.  pTab = pI
9780: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20  dx->pTable;.  n 
9790: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
97a0: 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  .  zType = sqlit
97b0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20  eMallocRaw( n+1 
97c0: 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  );.  if( zType==
97d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
97e0: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
97f0: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
9800: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9810: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
9820: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
9830: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
9840: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
9850: 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65  l[iCol].sortOrde
9860: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59  r & SQLITE_SO_TY
9870: 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  PEMASK)==SQLITE_
9880: 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  SO_TEXT ){.     
9890: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b   zType[i] = 't';
98a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
98b0: 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27    zType[i] = 'n'
98c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54  ;.    }.  }.  zT
98d0: 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  ype[n] = 0;.  sq
98e0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
98f0: 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e  (v, -1, zType, n
9900: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
9910: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
9920: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9930: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
9940: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
9950: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
9960: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
9970: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9980: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
9990: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
99a0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
99b0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
99c0: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
99d0: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
99e0: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
99f0: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
9a00: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
9a10: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
9a20: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
9a30: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
9a40: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
9a50: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
9a60: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
9a70: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
9a80: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
9a90: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
9aa0: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
9ab0: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
9ac0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
9ad0: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
9ae0: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
9af0: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
9b00: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
9b10: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
9b20: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
9b30: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
9b40: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
9b50: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
9b60: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
9b70: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
9b80: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
9b90: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
9ba0: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
9bb0: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
9bc0: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
9bd0: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
9be0: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
9bf0: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
9c00: 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  l sqliteEndTable
9c10: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
9c20: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
9c30: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
9c40: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
9c50: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
9c60: 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65 72 46   to sqliteDeferF
9c70: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
9c80: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
9c90: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
9ca0: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 46  id sqliteCreateF
9cb0: 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
9cc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9cd0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9ce0: 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74  text */.  IdList
9cf0: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f   *pFromCol,    /
9d00: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
9d10: 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
9d20: 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
9d30: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
9d40: 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
9d50: 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
9d60: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c 69   table */.  IdLi
9d70: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 20  st *pToCol,     
9d80: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
9d90: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
9da0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
9db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
9dc0: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
9dd0: 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
9de0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  {.  Table *p = p
9df0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9e00: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
9e10: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
9e20: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ol;.  char *z;. 
9e30: 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
9e40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
9e50: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
9e60: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
9e70: 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  r ) goto fk_end;
9e80: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
9e90: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
9ea0: 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
9eb0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
9ec0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
9ed0: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
9ee0: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29  pToCol->nId!=1 )
9ef0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
9f00: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
9f10: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f 72 65  ->zErrMsg, "fore
9f20: 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20 2d 31  ign key on ", -1
9f30: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
9f40: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
9f50: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 22 20  -1, .         " 
9f60: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
9f70: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
9f80: 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d 31 2c   of table ", -1,
9f90: 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 7a  .         pTo->z
9fa0: 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a 20 20  , pTo->n, 0);.  
9fb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9fc0: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ++;.      goto f
9fd0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
9fe0: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
9ff0: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
a000: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46   pToCol->nId!=pF
a010: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20  romCol->nId ){. 
a020: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
a030: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
a040: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 6e  Msg, .        "n
a050: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a060: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
a070: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
a080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
a090: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
a0a0: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
a0b0: 64 20 74 61 62 6c 65 22 2c 20 30 29 3b 0a 20 20  d table", 0);.  
a0c0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a0d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
a0e0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
a0f0: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
a100: 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  >nId;.  }.  nByt
a110: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
a120: 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  y) + nCol*sizeof
a130: 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
a140: 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
a150: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
a160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
a170: 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  oCol->nId; i++){
a180: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
a190: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
a1a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
a1b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
a1c0: 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
a1d0: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
a1e0: 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f   pFKey==0 ) goto
a1f0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79   fk_end;.  pFKey
a200: 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
a210: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
a220: 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
a230: 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b  = (char*)&pFKey[
a240: 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f  1];.  pFKey->aCo
a250: 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c  l = (struct sCol
a260: 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73  Map*)z;.  z += s
a270: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f  izeof(struct sCo
a280: 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46  lMap)*nCol;.  pF
a290: 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
a2a0: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
a2b0: 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
a2c0: 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20  To->n] = 0;.  z 
a2d0: 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
a2e0: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
a2f0: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
a300: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
a310: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
a320: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
a330: 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
a340: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
a350: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
a360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
a370: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
a380: 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
a390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
a3a0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
a3b0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
a3c0: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
a3d0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
a3e0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
a3f0: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
a400: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
a410: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a420: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
a430: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
a440: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
a450: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
a460: 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63  rMsg, "unknown c
a470: 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20 20 20  olumn \"", .    
a480: 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
a490: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 20  a[i].zName, "\" 
a4a0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
a4b0: 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30 29 3b 0a  efinition", 0);.
a4c0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
a4d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
a4e0: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
a4f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a500: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
a510: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
a520: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
a530: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
a540: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
a550: 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
a560: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
a570: 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
a580: 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
a590: 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
a5a0: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
a5b0: 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
a5c0: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
a5d0: 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
a5e0: 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
a5f0: 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66  f = flags & 0xff
a600: 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
a610: 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  eConf = (flags >
a620: 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20  > 8 ) & 0xff;.  
a630: 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
a640: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36  f = (flags >> 16
a650: 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a   ) & 0xff;..  /*
a660: 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
a670: 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
a680: 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
a690: 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
a6a0: 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
a6b0: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
a6c0: 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  nd:.  sqliteFree
a6d0: 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  (pFKey);.  sqlit
a6e0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 46  eIdListDelete(pF
a6f0: 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
a700: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54  eIdListDelete(pT
a710: 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
a720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a730: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
a740: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
a750: 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
a760: 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
a770: 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
a780: 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
a790: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
a7a0: 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
a7b0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
a7c0: 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
a7d0: 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
a7e0: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
a7f0: 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
a800: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
a810: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
a820: 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
a830: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
a840: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
a850: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 66 65 72  void sqliteDefer
a860: 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
a870: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
a880: 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61 62  Deferred){.  Tab
a890: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
a8a0: 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
a8b0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
a8c0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
a8d0: 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
a8e0: 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
a8f0: 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  n;.  pFKey->isDe
a900: 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72  ferred = isDefer
a910: 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  red;.}../*.** Cr
a920: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
a930: 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
a940: 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
a950: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
a960: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
a970: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
a980: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
a990: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
a9a0: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
a9b0: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
a9c0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
a9d0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
a9e0: 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
a9f0: 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
aa00: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
aa10: 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
aa20: 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
aa30: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
aa40: 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
aa50: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
aa60: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
aa70: 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
aa80: 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
aa90: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
aaa0: 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
aab0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
aac0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
aad0: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
aae0: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
aaf0: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
ab00: 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
ab10: 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
ab20: 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
ab30: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
ab40: 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
ab50: 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
ab60: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
ab70: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
ab80: 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
ab90: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
aba0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
abb0: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
abc0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
abd0: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
abe0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
abf0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
ac00: 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  dex.  May be NUL
ac10: 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
ac20: 70 54 61 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20  pTable, /* Name 
ac30: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
ac40: 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72  index.  Use pPar
ac50: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
ac60: 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a   0 */.  IdList *
ac70: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
ac80: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
ac90: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
aca0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
acb0: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
acc0: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
acd0: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
ace0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
acf0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
ad00: 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
ad10: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
ad20: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
ad30: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
ad40: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
ad50: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
ad60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ad70: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
ad80: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
ad90: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
ada0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
adb0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
adc0: 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
add0: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
ade0: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
adf0: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20  Index;   /* The 
ae00: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
ae10: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
ae20: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
ae30: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
ae40: 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  llId;           
ae50: 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
ae60: 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
ae70: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
ae80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ae90: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
aea0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
aeb0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
aec0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
aed0: 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
aee0: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
aef0: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
af00: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
af10: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
af20: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
af30: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
af40: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21    assert( pName!
af50: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
af60: 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d  ( pTable->nSrc==
af70: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  1 );.    pTab = 
af80: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 4c 6f   sqliteSrcListLo
af90: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
afa0: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
afb0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
afc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
afd0: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
afe0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
aff0: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
b000: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
b010: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b020: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
b030: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
b040: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
b050: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
b060: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
b070: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 22 20 6d  zName,.      " m
b080: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
b090: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
b0a0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
b0b0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
b0c0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
b0d0: 28 20 21 69 73 54 65 6d 70 20 26 26 20 70 54 61  ( !isTemp && pTa
b0e0: 62 2d 3e 69 44 62 3e 3d 32 20 29 7b 0a 20 20 20  b->iDb>=2 ){.   
b0f0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
b100: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
b110: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
b120: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
b130: 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20   " may not have 
b140: 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 69 6e  non-temporary in
b150: 64 69 63 65 73 20 61 64 64 65 64 22 2c 20 30 29  dices added", 0)
b160: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
b170: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
b180: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b190: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
b1a0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
b1b0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
b1c0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
b1d0: 67 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  g, "views may no
b1e0: 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 30  t be indexed", 0
b1f0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
b200: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
b210: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
b220: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  x;.  }.  if( pTa
b230: 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  b->iDb==1 ){.   
b240: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 20 20 7d   isTemp = 1;.  }
b250: 0a 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 49 66  ...#if 0.  /* If
b260: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 63   this index is c
b270: 72 65 61 74 65 64 20 77 68 69 6c 65 20 72 65 2d  reated while re-
b280: 72 65 61 64 69 6e 67 20 74 68 65 20 73 63 68 65  reading the sche
b290: 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  ma from sqlite_m
b2a0: 61 73 74 65 72 0a 20 20 2a 2a 20 62 75 74 20 74  aster.  ** but t
b2b0: 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  he table associa
b2c0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
b2d0: 64 65 78 20 69 73 20 61 20 74 65 6d 70 6f 72 61  dex is a tempora
b2e0: 72 79 20 74 61 62 6c 65 2c 20 69 74 20 63 61 6e  ry table, it can
b2f0: 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20  .  ** only mean 
b300: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 74  that the table t
b310: 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69  hat this index i
b320: 73 20 72 65 61 6c 6c 79 20 61 73 73 6f 63 69 61  s really associa
b330: 74 65 64 20 77 69 74 68 20 69 73 0a 20 20 2a 2a  ted with is.  **
b340: 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61 6d 65 20   one whose name 
b350: 69 73 20 68 69 64 64 65 6e 20 62 65 68 69 6e 64  is hidden behind
b360: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b370: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
b380: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e 63   name..  ** Sinc
b390: 65 20 69 74 73 20 74 61 62 6c 65 20 68 61 73 20  e its table has 
b3a0: 62 65 65 6e 20 73 75 70 70 72 65 73 73 65 64 2c  been suppressed,
b3b0: 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c 73 6f   we need to also
b3c0: 20 73 75 70 70 72 65 73 73 20 74 68 65 0a 20 20   suppress the.  
b3d0: 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  ** index..  */. 
b3e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
b3f0: 74 46 6c 61 67 20 26 26 20 21 70 50 61 72 73 65  tFlag && !pParse
b400: 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 54 61 62  ->isTemp && pTab
b410: 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20 67 6f 74  ->iDb ){.    got
b420: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
b430: 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
b440: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
b450: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b460: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
b470: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
b480: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
b490: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
b4a0: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
b4b0: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
b4c0: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
b4d0: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
b4e0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
b4f0: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
b500: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
b510: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b520: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
b530: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
b540: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
b550: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
b560: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
b570: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
b580: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
b590: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
b5a0: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
b5b0: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
b5c0: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
b5d0: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
b5e0: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
b5f0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
b600: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
b610: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
b620: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
b630: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
b640: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
b650: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
b660: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
b670: 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e 69 6e  e && !pParse->in
b680: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 49 6e  itFlag ){.    In
b690: 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
b6a0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
b6b0: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
b6c0: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54  me name */.    T
b6d0: 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65  able *pTSameName
b6e0: 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;    /* A table 
b6f0: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
b700: 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s the index */. 
b710: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
b720: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
b730: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
b740: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
b750: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
b760: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
b770: 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pISameName = s
b780: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
b790: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
b7a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b7b0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
b7c0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
b7d0: 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20  ex ", zName, .  
b7e0: 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79         " already
b7f0: 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20   exists", 0);.  
b800: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
b810: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ++;.      goto e
b820: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b840: 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pTSameName = sq
b850: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62  liteFindTable(db
b860: 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
b870: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
b880: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
b890: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72  ->zErrMsg, "ther
b8a0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
b8b0: 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20  able named ",.  
b8c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29         zName, 0)
b8d0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
b8e0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
b8f0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
b900: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
b910: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
b920: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
b930: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
b940: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
b950: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
b960: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
b970: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
b980: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
b990: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
b9a0: 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29  tf(zBuf,"%d)",n)
b9b0: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
b9c0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
b9d0: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22  ring(&zName, "("
b9e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  , pTab->zName, "
b9f0: 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42   autoindex ", zB
ba00: 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  uf, 0);.    if( 
ba10: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
ba20: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ba30: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
ba40: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
ba50: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
ba60: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a  pName->n);.  }..
ba70: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
ba80: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
ba90: 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
baa0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
bab0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
bac0: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
bad0: 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69  ( isTemp==0 || i
bae0: 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73  sTemp==1 );.  as
baf0: 73 65 72 74 28 20 70 54 61 62 2d 3e 69 44 62 3d  sert( pTab->iDb=
bb00: 3d 70 50 61 72 73 65 2d 3e 69 44 62 20 7c 7c 20  =pParse->iDb || 
bb10: 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 69  isTemp==1 );.  i
bb20: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
bb30: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
bb40: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
bb50: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
bb60: 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  0) ){.    goto e
bb70: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bb80: 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 53 51 4c 49  ;.  }.  i = SQLI
bb90: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
bba0: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20  .  if( isTemp ) 
bbb0: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
bbc0: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
bbd0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
bbe0: 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
bbf0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
bc00: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
bc10: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bc20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
bc30: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
bc40: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
bc50: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
bc60: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
bc70: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
bc80: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
bc90: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
bca0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
bcb0: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
bcc0: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
bcd0: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
bce0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
bcf0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
bd00: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
bd10: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
bd20: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
bd30: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
bd40: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
bd50: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
bd60: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
bd70: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
bd80: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
bd90: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
bda0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
bdb0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
bdc0: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
bdd0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
bde0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
bdf0: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
be00: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
be10: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
be30: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
be40: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
be50: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
be60: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
be70: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
be80: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
be90: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
bea0: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
beb0: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
bec0: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
bed0: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
bee0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
bef0: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
bf00: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
bf10: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
bf20: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
bf30: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  ex->onError = pI
bf40: 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d  ndex->isUnique =
bf50: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
bf60: 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
bf70: 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64  pName==0;.  pInd
bf80: 65 78 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d 70  ex->iDb = isTemp
bf90: 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69   ? 1 : pParse->i
bfa0: 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74  Db;..  /* Scan t
bfb0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
bfc0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
bfd0: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
bfe0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
bff0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
c000: 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
c010: 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
c020: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
c030: 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
c040: 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
c050: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
c060: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
c070: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  +){.    for(j=0;
c080: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
c090: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c0a0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69  qliteStrICmp(pLi
c0b0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
c0c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
c0d0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
c0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
c0f0: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
c100: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
c110: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
c120: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
c130: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
c140: 20 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f          " has no
c150: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c   column named ",
c160: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
c170: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  me, 0);.      pP
c180: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
c190: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
c1a0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f  Index);.      go
c1b0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c1c0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
c1d0: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
c1e0: 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20  [i] = j;.  }..  
c1f0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
c200: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
c210: 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
c220: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
c230: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
c240: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
c250: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  . .  */.  if( !p
c260: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
c270: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
c280: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61      p = sqliteHa
c290: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
c2a0: 62 5b 69 73 54 65 6d 70 5d 2e 69 64 78 48 61 73  b[isTemp].idxHas
c2b0: 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
c2d0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
c2e0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  en(zName)+1, pIn
c2f0: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
c300: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c310: 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
c320: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
c330: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
c340: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
c350: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
c360: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c370: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
c380: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
c390: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
c3a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
c3b0: 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
c3c0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
c3d0: 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
c3e0: 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
c3f0: 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
c400: 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
c410: 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
c420: 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
c430: 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
c440: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
c450: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
c460: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
c470: 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
c480: 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
c490: 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
c4a0: 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
c4b0: 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
c4c0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
c4d0: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
c4e0: 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64  place){.    pInd
c4f0: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
c500: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
c510: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
c520: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
c530: 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
c540: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
c550: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
c560: 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
c570: 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
c580: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
c590: 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  {.      pOther =
c5a0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
c5b0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
c5c0: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
c5d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74  ->pNext;.    pOt
c5e0: 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
c5f0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
c600: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
c610: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
c620: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
c630: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
c640: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
c650: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
c660: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
c670: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
c680: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
c690: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
c6a0: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
c6b0: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
c6c0: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
c6d0: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
c6e0: 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20  ag && pTable!=0 
c6f0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
c700: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
c710: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
c720: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
c730: 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
c740: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
c750: 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
c760: 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
c770: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
c780: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
c790: 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
c7a0: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
c7b0: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
c7c0: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
c7d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e    **.  ** The in
c7e0: 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e  itFlag is 0 when
c7f0: 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
c800: 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
c810: 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
c820: 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c  and.  The initFl
c830: 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  ag is 1 when a d
c840: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
c850: 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
c860: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
c870: 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
c880: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
c890: 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
c8a0: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
c8b0: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
c8c0: 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
c8d0: 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
c8e0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
c8f0: 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
c900: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
c910: 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  able==0 it means
c920: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
c930: 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
c940: 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
c950: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
c960: 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
c970: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
c980: 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
c990: 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
c9a0: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
c9b0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
c9c0: 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
c9d0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
c9e0: 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
c9f0: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
ca00: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
ca10: 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a  >initFlag==0 ){.
ca20: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
ca30: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
ca40: 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20  lbl1, lbl2;.    
ca50: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
ca60: 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  ddr;..    v = sq
ca70: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
ca80: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
ca90: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
caa0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
cab0: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
cac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
cad0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
cae0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65  (pParse, 0, isTe
caf0: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
cb00: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
cb10: 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20  (v, isTemp);.   
cb20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
cb30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
cb40: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
cb50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cb60: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
cb70: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
cb80: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
cb90: 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c 20 50 33   -1, "index", P3
cba0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
cbb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
cbc0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
cbd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
cbe0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
cbf0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
cc00: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
cc10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cc20: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
cc30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
cc40: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
cc50: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
cc60: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
cc70: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
cc80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
cc90: 61 74 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54  ateIndex, 0, isT
cca0: 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
ccb0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
ccc0: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49  addr, (char*)&pI
ccd0: 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  ndex->tnum, P3_P
cce0: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e  OINTER);.    pIn
ccf0: 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20  dex->tnum = 0;. 
cd00: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
cd10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
cd20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
cd30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
cd40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cd50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73  , OP_Integer, is
cd60: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  Temp, 0);.      
cd70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cd80: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
cd90: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
cda0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
cdb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
cdc0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
cdd0: 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
cde0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20  pEnd ){.      n 
cdf0: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
ce00: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
ce10: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
ce20: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ce30: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
ce40: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >z, n);.    }.  
ce50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ce60: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
ce70: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73  rd, 5, 0);.    s
ce80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ce90: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
cea0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
ceb0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  Table ){.      s
cec0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ced0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
cee0: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
cef0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cf00: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
cf10: 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  d, 2, pTab->tnum
cf20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
cf30: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
cf40: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
cf50: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
cf60: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
cf70: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
cf80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
cf90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
cfa0: 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
cfb0: 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
cfc0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
cfd0: 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a  P_Recno, 2, 0);.
cfe0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cff0: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
d000: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d020: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
d030: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
d040: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
d050: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d060: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
d070: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
d080: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
d090: 20 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66    if( db->file_f
d0a0: 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74  ormat>=4 ) sqlit
d0b0: 65 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 76  eAddIdxKeyType(v
d0c0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  , pIndex);.     
d0d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d0e0: 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31  (v, OP_IdxPut, 1
d0f0: 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  , pIndex->onErro
d100: 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20  r!=OE_None);.   
d110: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d120: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e  ngeP3(v, -1, "in
d130: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
d140: 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
d150: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
d160: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d170: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
d180: 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
d190: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
d1a0: 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20  bel(v, lbl2);.  
d1b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d1c0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
d1d0: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
d1e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d1f0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
d200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d210: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
d220: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
d230: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d240: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
d250: 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   v);.      }.   
d260: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d270: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d280: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d290: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
d2a0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
d2b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
d2c0: 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
d2d0: 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
d2e0: 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
d2f0: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
d300: 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
d310: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
d320: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
d330: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
d340: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
d350: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d360: 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
d370: 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
d380: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
d390: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
d3a0: 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
d3b0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
d3c0: 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61  liteDropIndex(Pa
d3d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
d3e0: 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
d3f0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
d400: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
d410: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
d420: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
d430: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
d440: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
d450: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d460: 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
d470: 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20  ==1 );.  pIndex 
d480: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
d490: 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
d4a0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
d4b0: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
d4c0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
d4d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
d4e0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
d4f0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
d500: 63 68 20 69 6e 64 65 78 3a 20 22 2c 20 70 4e 61  ch index: ", pNa
d510: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
d520: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
d530: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
d540: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
d550: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
d560: 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
d570: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
d580: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
d590: 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 61 73  rrMsg, "index as
d5a0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
d5b0: 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
d5c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
d5d0: 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
d5e0: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
d5f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
d600: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
d610: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
d620: 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
d630: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  iDb>1 ){.    sql
d640: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
d650: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
d660: 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63 68  cannot alter sch
d670: 65 6d 61 20 6f 66 20 61 74 74 61 63 68 65 64 20  ema of attached 
d680: 22 0a 20 20 20 20 20 20 20 22 64 61 74 61 62 61  ".       "databa
d690: 73 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ses", 0);.    pP
d6a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
d6b0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
d6c0: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
d6d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d6e0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
d6f0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
d700: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
d710: 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
d720: 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
d730: 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 73 71  able;.    if( sq
d740: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
d750: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
d760: 45 54 45 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ETE, SCHEMA_TABL
d770: 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 2c 20  E(pIndex->iDb), 
d780: 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  0) ){.      goto
d790: 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
d7a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d7b0: 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f  pIndex->iDb ) co
d7c0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
d7d0: 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
d7e0: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
d7f0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
d800: 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
d810: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29  , pTab->zName) )
d820: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
d830: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
d840: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
d850: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d860: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
d870: 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
d880: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
d890: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
d8a0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d8b0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
d8c0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72  static VdbeOp dr
d8d0: 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20  opIndex[] = {.  
d8e0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
d8f0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
d900: 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50   0}, .      { OP
d910: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
d920: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
d930: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
d940: 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
d950: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
d960: 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
d970: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30     1, 0,       0
d980: 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20  }, /* 3 */.     
d990: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
d9a0: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    0, 1,       0}
d9b0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c  ,.      { OP_Eq,
d9c0: 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
d9d0: 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (8), 0},.      {
d9e0: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
d9f0: 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a  0, ADDR(3), 0},.
da00: 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
da10: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
da20: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
da30: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
da40: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
da50: 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   8 */.    };.   
da60: 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20   int base;..    
da70: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
da80: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
da90: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  , 0, pIndex->iDb
daa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65  );.    sqliteOpe
dab0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
dac0: 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
dad0: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
dae0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
daf0: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
db00: 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
db10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
db20: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
db30: 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +1, pIndex->zNam
db40: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
db50: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b  Index->iDb==0 ){
db60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61  .      sqliteCha
db70: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
db80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
db90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
dba0: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
dbb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
dbc0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
dbd0: 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
dbe0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
dbf0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
dc00: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
dc10: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  e);.  }..  /* De
dc20: 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lete the in-memo
dc30: 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ry description o
dc40: 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  f this index..  
dc50: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
dc60: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
dc70: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
dc80: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
dc90: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d  pIndex);.    db-
dca0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
dcb0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
dcc0: 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
dcd0: 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 53 72  ndex:.  sqliteSr
dce0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
dcf0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  e);.}../*.** App
dd00: 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
dd10: 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
dd20: 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
dd30: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
dd40: 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
dd50: 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
dd60: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
dd70: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
dd80: 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
dd90: 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70  *sqliteIdListApp
dda0: 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
ddb0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
ddc0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
ddd0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
dde0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
ddf0: 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
de00: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
de10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
de20: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
de30: 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20  nId & 7)==0 ){. 
de40: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
de50: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20  _item *a;.    a 
de60: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
de70: 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74  pList->a, (pList
de80: 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28  ->nId+8)*sizeof(
de90: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
dea0: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
deb0: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
dec0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
ded0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
dee0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
def0: 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d  ->a = a;.  }.  m
df00: 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
df10: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20  pList->nId], 0, 
df20: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
df30: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  0]));.  if( pTok
df40: 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
df50: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
df60: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
df70: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
df80: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b  NString(pz, pTok
df90: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
dfa0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
dfb0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
dfc0: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
dfd0: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
dfe0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
dff0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
e000: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
e010: 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d    }.  }.  pList-
e020: 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
e030: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
e040: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
e050: 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
e060: 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
e070: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
e080: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
e090: 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
e0a0: 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
e0b0: 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
e0c0: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
e0d0: 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
e0e0: 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
e0f0: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
e100: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
e110: 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
e120: 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
e130: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
e140: 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
e150: 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
e160: 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
e170: 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
e180: 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
e190: 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
e1a0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
e1b0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
e1c0: 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
e1d0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e1e0: 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
e1f0: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
e200: 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
e210: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
e220: 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
e230: 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
e240: 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
e250: 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
e260: 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
e270: 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
e280: 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
e290: 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
e2a0: 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
e2b0: 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
e2c0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
e2d0: 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
e2e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
e2f0: 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
e300: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
e310: 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
e320: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
e330: 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
e340: 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
e350: 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
e360: 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
e370: 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
e380: 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
e390: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
e3a0: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70  sqliteSrcListApp
e3b0: 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  end(A,B,C);.**.*
e3c0: 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
e3d0: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
e3e0: 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
e3f0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
e400: 74 20 2a 73 71 6c 69 74 65 53 72 63 4c 69 73 74  t *sqliteSrcList
e410: 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
e420: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
e430: 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
e440: 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70  tabase){.  if( p
e450: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
e460: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
e470: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
e480: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
e490: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
e4a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
e4b0: 70 4c 69 73 74 2d 3e 6e 53 72 63 20 26 20 37 29  pList->nSrc & 7)
e4c0: 3d 3d 31 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  ==1 ){.    SrcLi
e4d0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e  st *pNew;.    pN
e4e0: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
e4f0: 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
e500: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
e510: 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
e520: 2d 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f 66  ->nSrc+8)*sizeof
e530: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
e540: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
e550: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e560: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  SrcListDelete(pL
e570: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
e580: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
e590: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
e5a0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73  }.  memset(&pLis
e5b0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
e5c0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
e5d0: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
e5e0: 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
e5f0: 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
e600: 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
e610: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
e620: 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62  Database && pTab
e630: 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  le ){.    Token 
e640: 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
e650: 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
e660: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
e670: 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
e680: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65    }.  if( pTable
e690: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
e6a0: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
e6b0: 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65  ist->nSrc].zName
e6c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
e6d0: 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c  String(pz, pTabl
e6e0: 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c  e->z, pTable->n,
e6f0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
e700: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
e710: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
e720: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
e730: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
e740: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
e750: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
e760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44    }.  }.  if( pD
e770: 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63  atabase ){.    c
e780: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73  har **pz = &pLis
e790: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
e7a0: 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20  ].zDatabase;.   
e7b0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
e7c0: 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d  g(pz, pDatabase-
e7d0: 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e  >z, pDatabase->n
e7e0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
e7f0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
e800: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
e810: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
e820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
e830: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e840: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
e850: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
e860: 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
e870: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
e880: 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
e890: 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
e8a0: 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
e8b0: 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
e8c0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
e8d0: 69 74 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69  iteSrcListAddAli
e8e0: 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
e8f0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
e900: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
e910: 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
e920: 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
e930: 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a  List->nSrc - 1;.
e940: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
e950: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
e960: 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e  ].zAlias, pToken
e970: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
e980: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  0);.    sqliteDe
e990: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
e9a0: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d  ].zAlias);.  }.}
e9b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
e9c0: 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
e9d0: 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65  d sqliteIdListDe
e9e0: 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
e9f0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
ea00: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
ea10: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
ea20: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
ea30: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ea40: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
ea50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
ea60: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
ea70: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
ea80: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
ea90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
eaa0: 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
eab0: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
eac0: 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
ead0: 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
eae0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
eaf0: 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49  iteIdListIndex(I
eb00: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
eb10: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
eb20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
eb30: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
eb40: 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
eb50: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
eb60: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
eb70: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
eb80: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
eb90: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
eba0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
ebb0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n -1;.}../*.** D
ebc0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
ebd0: 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
ebe0: 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
ebf0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
ec00: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
ec10: 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
ec20: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
ec30: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
ec40: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
ec50: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
ec60: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
ec70: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
ec80: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
ec90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
eca0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
ecb0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
ecc0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
ecd0: 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  as);.    if( pLi
ece0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26  st->a[i].pTab &&
ecf0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
ed00: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
ed10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
ed20: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69  leteTable(0, pLi
ed30: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a  st->a[i].pTab);.
ed40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ed50: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69  SelectDelete(pLi
ed60: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
ed70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
ed80: 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  rDelete(pList->a
ed90: 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  [i].pOn);.    sq
eda0: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
edb0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73  (pList->a[i].pUs
edc0: 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
edd0: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
ede0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
edf0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
ee00: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
ee10: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
ee20: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
ee30: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
ee40: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
ee50: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
ee60: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
ee70: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
ee80: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
ee90: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
eea0: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
eeb0: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
eec0: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
eed0: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
eee0: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
eef0: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
ef00: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
ef10: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
ef20: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
ef30: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
ef40: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
ef50: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
ef60: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
ef70: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
ef80: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
ef90: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
efa0: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
efb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
efc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
efd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
efe0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 4e  SrcList *pTableN
eff0: 61 6d 65 2c 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ame, /* The name
f000: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
f010: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
f020: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
f030: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
f040: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
f050: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
f060: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
f070: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
f080: 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20  miter,   /* Use 
f090: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
f0a0: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20  d delimiter */. 
f0b0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20   int onError    
f0c0: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
f0d0: 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61   do if a constra
f0e0: 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a  int fails */.){.
f0f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
f100: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a   int i;.  Vdbe *
f110: 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65  v;.  int addr, e
f120: 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  nd;.  Index *pId
f130: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  x;.  char *zFile
f140: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a   = 0;.  sqlite *
f150: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
f160: 0a 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f  ...  if( sqlite_
f170: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 20 29  malloc_failed  )
f180: 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e   goto copy_clean
f190: 75 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  up;.  assert( pT
f1a0: 61 62 6c 65 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  ableName->nSrc==
f1b0: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
f1c0: 6c 69 74 65 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  liteSrcListLooku
f1d0: 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  p(pParse, pTable
f1e0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
f1f0: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 49 73  b==0 || sqliteIs
f200: 52 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c  ReadOnly(pParse,
f210: 20 70 54 61 62 29 20 29 20 67 6f 74 6f 20 63 6f   pTab) ) goto co
f220: 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7a 46  py_cleanup;.  zF
f230: 69 6c 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ile = sqliteStrN
f240: 44 75 70 28 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a  Dup(pFilename->z
f250: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b  , pFilename->n);
f260: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
f270: 28 7a 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 73  (zFile);.  if( s
f280: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
f290: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
f2a0: 53 45 52 54 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  SERT, pTab->zNam
f2b0: 65 2c 20 7a 46 69 6c 65 29 0a 20 20 20 20 20 20  e, zFile).      
f2c0: 7c 7c 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  || sqliteAuthChe
f2d0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
f2e0: 45 5f 43 4f 50 59 2c 20 70 54 61 62 2d 3e 7a 4e  E_COPY, pTab->zN
f2f0: 61 6d 65 2c 20 7a 46 69 6c 65 29 20 29 7b 0a 20  ame, zFile) ){. 
f300: 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65     goto copy_cle
f310: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  anup;.  }.  v = 
f320: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
f330: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
f340: 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  {.    sqliteBegi
f350: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
f360: 70 50 61 72 73 65 2c 20 31 2c 20 70 54 61 62 2d  pParse, 1, pTab-
f370: 3e 69 44 62 3d 3d 31 29 3b 0a 20 20 20 20 61 64  >iDb==1);.    ad
f380: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
f390: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 4f  ddOp(v, OP_FileO
f3a0: 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pen, 0, 0);.    
f3b0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
f3c0: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 46 69 6c  P3(v, addr, pFil
f3d0: 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e  ename->z, pFilen
f3e0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
f3f0: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
f400: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73  (v, addr);.    s
f410: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f420: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
f430: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
f440: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f450: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
f460: 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  , 0, pTab->tnum)
f470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
f480: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
f490: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pTab->zName, P3_
f4a0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66 6f 72  STATIC);.    for
f4b0: 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d  (i=1, pIdx=pTab-
f4c0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f4d0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
f4e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
f4f0: 65 72 74 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d  ert( pIdx->iDb==
f500: 31 20 7c 7c 20 70 49 64 78 2d 3e 69 44 62 3d 3d  1 || pIdx->iDb==
f510: 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20  pTab->iDb );.   
f520: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f530: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
f540: 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b  , pIdx->iDb, 0);
f550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f560: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
f570: 6e 57 72 69 74 65 2c 20 69 2c 20 70 49 64 78 2d  nWrite, i, pIdx-
f580: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71  >tnum);.      sq
f590: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
f5a0: 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
f5b0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
f5c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
f5d0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
f5e0: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20  E_CountRows ){. 
f5f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f600: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
f610: 65 72 2c 20 30 2c 20 30 29 3b 20 20 2f 2a 20 49  er, 0, 0);  /* I
f620: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
f630: 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d  w count */.    }
f640: 0a 20 20 20 20 65 6e 64 20 3d 20 73 71 6c 69 74  .    end = sqlit
f650: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
f660: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
f670: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f680: 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c 20 70 54   OP_FileRead, pT
f690: 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 29 3b 0a  ab->nCol, end);.
f6a0: 20 20 20 20 69 66 28 20 70 44 65 6c 69 6d 69 74      if( pDelimit
f6b0: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
f6c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
f6d0: 2c 20 61 64 64 72 2c 20 70 44 65 6c 69 6d 69 74  , addr, pDelimit
f6e0: 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69 74 65  er->z, pDelimite
f6f0: 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  r->n);.      sql
f700: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
f710: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
f720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f730: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
f740: 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c 20 31 29  , addr, "\t", 1)
f750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f760: 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
f770: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
f780: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
f790: 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54 61 62 2d 3e  leColumn, pTab->
f7a0: 69 50 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  iPKey, 0);.     
f7b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f7c0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f7d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
f7e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f7f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f800: 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
f810: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
f820: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
f830: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f840: 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( i==pTab->iPKey
f850: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
f860: 68 65 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  he integer prima
f870: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73  ry key column is
f880: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 4e 55 4c   filled with NUL
f890: 4c 20 73 69 6e 63 65 20 69 74 73 0a 20 20 20 20  L since its.    
f8a0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20      ** value is 
f8b0: 61 6c 77 61 79 73 20 70 75 6c 6c 65 64 20 66 72  always pulled fr
f8c0: 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  om the record nu
f8d0: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  mber */.        
f8e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f8f0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
f900: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
f910: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f920: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f930: 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c 20 30  FileColumn, i, 0
f940: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f950: 0a 20 20 20 20 73 71 6c 69 74 65 47 65 6e 65 72  .    sqliteGener
f960: 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
f970: 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  cks(pParse, pTab
f980: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 6f 6e  , 0, 0, 0, 0, on
f990: 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a 20 20  Error, addr);.  
f9a0: 20 20 73 71 6c 69 74 65 43 6f 6d 70 6c 65 74 65    sqliteComplete
f9b0: 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73 65  Insertion(pParse
f9c0: 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  , pTab, 0, 0, 0,
f9d0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62   0);.    if( (db
f9e0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
f9f0: 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29  _CountRows)!=0 )
fa00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
fa10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
fa20: 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 20 20 2f 2a  dImm, 1, 0);  /*
fa30: 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f 77 20 63   Increment row c
fa40: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ount */.    }.  
fa50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fa60: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
fa70: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
fa80: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
fa90: 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 20 20  el(v, end);.    
faa0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fab0: 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  v, OP_Noop, 0, 0
fac0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64  );.    sqliteEnd
fad0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
fae0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
faf0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
fb00: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a  TE_CountRows ){.
fb10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
fb20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
fb30: 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20  mnName, 0, 0);. 
fb40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
fb50: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
fb60: 72 6f 77 73 20 69 6e 73 65 72 74 65 64 22 2c 20  rows inserted", 
fb70: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
fb80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fb90: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
fba0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
fbb0: 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65 61 6e   }.  .copy_clean
fbc0: 75 70 3a 0a 20 20 73 71 6c 69 74 65 53 72 63 4c  up:.  sqliteSrcL
fbd0: 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  istDelete(pTable
fbe0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
fbf0: 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 72 65  ree(zFile);.  re
fc00: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
fc10: 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20  he non-standard 
fc20: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69  VACUUM command i
fc30: 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  s used to clean 
fc40: 75 70 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  up the database,
fc50: 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65  .** collapse fre
fc60: 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49  e space, etc.  I
fc70: 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66  t is modelled af
fc80: 74 65 72 20 74 68 65 20 56 41 43 55 55 4d 20 63  ter the VACUUM c
fc90: 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73  ommand.** in Pos
fca0: 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49  tgreSQL..**.** I
fcb0: 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78 20  n version 1.0.x 
fcc0: 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20 56  of SQLite, the V
fcd0: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f  ACUUM command wo
fce0: 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d  uld call.** gdbm
fcf0: 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f 6e  _reorganize() on
fd00: 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73   all the databas
fd10: 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 62  e tables.  But b
fd20: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68  eginning.** with
fd30: 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20 6e   2.0.0, SQLite n
fd40: 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47 44  o longer uses GD
fd50: 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d 61  BM so this comma
fd60: 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d 65  nd has.** become
fd70: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69   a no-op..*/.voi
fd80: 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50  d sqliteVacuum(P
fd90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
fda0: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29  ken *pTableName)
fdb0: 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  {.  /* Do nothin
fdc0: 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  g */.}../*.** Be
fdd0: 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
fde0: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
fdf0: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
fe00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
fe10: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
fe20: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
fe30: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
fe40: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
fe50: 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
fe60: 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
fe70: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
fe80: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
fe90: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
fea0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
feb0: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
fec0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
fed0: 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
fee0: 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  , 0) ) return;. 
fef0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
ff00: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
ff10: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
ff20: 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Err++;.    sqlit
ff30: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
ff40: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 63 61  se->zErrMsg, "ca
ff50: 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61  nnot start a tra
ff60: 6e 73 61 63 74 69 6f 6e 20 22 0a 20 20 20 20 20  nsaction ".     
ff70: 20 20 22 77 69 74 68 69 6e 20 61 20 74 72 61 6e    "within a tran
ff80: 73 61 63 74 69 6f 6e 22 2c 20 30 29 3b 0a 20 20  saction", 0);.  
ff90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
ffa0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
ffb0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
ffc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66  , 0, 0);.  db->f
ffd0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
ffe0: 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e  nTrans;.  db->on
fff0: 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
10000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
10010 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
10020 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d  /.void sqliteCom
10030 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
10040 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
10050 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
10060 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
10070 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
10080 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
10090 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
100a0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
100b0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
100c0 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
100d0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
100e0 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
100f0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
10100 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
10110 54 22 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b  T", 0) ) return;
10120 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
10130 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
10140 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ns)==0 ){.    pP
10150 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
10160 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
10170 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
10180 73 67 2c 20 0a 20 20 20 20 20 20 20 22 63 61 6e  sg, .       "can
10190 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20  not commit - no 
101a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
101b0 63 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20  ctive", 0);.    
101c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62  return;.  }.  db
101d0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
101e0 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71  TE_InTrans;.  sq
101f0 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
10200 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
10210 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
10220 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
10230 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74  .** Rollback a t
10240 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
10250 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63  id sqliteRollbac
10260 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
10270 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
10280 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62  qlite *db;.  Vdb
10290 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
102a0 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
102b0 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
102c0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
102d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
102e0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
102f0 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
10300 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
10310 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74  .  if( sqliteAut
10320 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
10330 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
10340 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
10350 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
10360 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
10370 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
10380 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
10390 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nErr++;.    sql
103a0 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
103b0 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20  arse->zErrMsg,. 
103c0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72 6f        "cannot ro
103d0 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e  llback - no tran
103e0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
103f0 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
10400 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73  rn; .  }.  v = s
10410 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10420 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
10430 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10440 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62  ddOp(v, OP_Rollb
10450 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ack, 0, 0);.  }.
10460 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
10470 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
10480 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
10490 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f  OE_Default;.}../
104a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
104b0 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
104c0 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
104d0 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61  ema cookie for a
104e0 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61  ll.** named data
104f0 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76  base files..*/.v
10500 6f 69 64 20 73 71 6c 69 74 65 43 6f 64 65 56 65  oid sqliteCodeVe
10510 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
10520 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
10530 20 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   i;.  sqlite *db
10540 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10550 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
10560 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
10570 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
10580 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
10590 20 20 69 66 28 20 69 3d 3d 31 20 7c 7c 20 64 62    if( i==1 || db
105a0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20  ->aDb[i].pBt==0 
105b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
105c0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
105d0 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
105e0 69 65 2c 20 30 2c 20 64 62 2d 3e 61 44 62 5b 69  ie, 0, db->aDb[i
105f0 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29  ].schema_cookie)
10600 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
10610 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
10620 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   1;.}../*.** Gen
10630 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
10640 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
10650 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
10660 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
10670 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
10680 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
10690 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
106a0 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  s a new transact
106b0 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ion if we are no
106c0 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  t already within
106d0 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
106e0 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c  n.  If we are al
106f0 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74  ready within a t
10700 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
10710 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a   a checkpoint.**
10720 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73   is set if the s
10730 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 70 61 72  etCheckpoint par
10740 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
10750 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
10760 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
10770 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
10780 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
10790 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
107a0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
107b0 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
107c0 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
107d0 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
107e0 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
107f0 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
10800 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
10810 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
10820 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
10830 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
10840 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
10850 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
10860 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
10870 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
10880 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
10890 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
108a0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
108b0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
108c0 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
108d0 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 6d 70 4f 6e  **.** The tempOn
108e0 6c 79 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  ly flag indicate
108f0 73 20 74 68 61 74 20 6f 6e 6c 79 20 74 65 6d 70  s that only temp
10900 6f 72 61 72 79 20 74 61 62 6c 65 73 20 77 69 6c  orary tables wil
10910 6c 20 62 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20  l be changed.** 
10920 64 75 72 69 6e 67 20 74 68 69 73 20 77 72 69 74  during this writ
10930 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68  e operation.  Th
10940 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
10950 73 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  se table is not.
10960 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2e  ** write-locked.
10970 20 20 4f 6e 6c 79 20 74 68 65 20 74 65 6d 70 6f    Only the tempo
10980 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
10990 6c 65 20 67 65 74 73 20 61 20 77 72 69 74 65 20  le gets a write 
109a0 6c 6f 63 6b 2e 0a 2a 2a 20 4f 74 68 65 72 20 70  lock..** Other p
109b0 72 6f 63 65 73 73 65 73 20 63 61 6e 20 63 6f 6e  rocesses can con
109c0 74 69 6e 75 65 20 74 6f 20 72 65 61 64 20 6f 72  tinue to read or
109d0 20 77 72 69 74 65 20 74 68 65 20 70 72 69 6d 61   write the prima
109e0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
109f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10a00 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
10a10 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
10a20 65 2c 20 69 6e 74 20 73 65 74 43 68 65 63 6b 70  e, int setCheckp
10a30 6f 69 6e 74 2c 20 69 6e 74 20 74 65 6d 70 4f 6e  oint, int tempOn
10a40 6c 79 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ly){.  Vdbe *v;.
10a50 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
10a60 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10a70 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10a80 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10a90 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75  trigStack ) retu
10aa0 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69  rn; /* if this i
10ab0 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a  s in a trigger *
10ac0 2f 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  /.  if( (pParse-
10ad0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10ae0 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
10af0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
10b00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61  eAddOp(v, OP_Tra
10b10 6e 73 61 63 74 69 6f 6e 2c 20 31 2c 20 30 29 3b  nsaction, 1, 0);
10b20 0a 20 20 20 20 69 66 28 20 21 74 65 6d 70 4f 6e  .    if( !tempOn
10b30 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ly ){.      sqli
10b40 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10b50 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30  P_Transaction, 0
10b60 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10b70 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  teCodeVerifySche
10b80 6d 61 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ma(pParse);.    
10b90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65  }.  }else if( se
10ba0 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20  tCheckpoint ){. 
10bb0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10bc0 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f  Op(v, OP_Checkpo
10bd0 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  int, 0, 0);.    
10be0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10bf0 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
10c00 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
10c10 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10c20 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64  ode that conclud
10c30 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  es an operation 
10c40 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63 68  that may have ch
10c50 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74  anged.** the dat
10c60 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
10c70 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e 63  a companion func
10c80 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72 69  tion to BeginWri
10c90 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a 2a  teOperation()..*
10ca0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
10cb0 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  on was started, 
10cc0 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e 20  then commit it. 
10cd0 20 49 66 20 61 20 63 68 65 63 6b 70 6f 69 6e 74   If a checkpoint
10ce0 20 77 61 73 0a 2a 2a 20 73 74 61 72 74 65 64 20   was.** started 
10cf0 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61 74  then commit that
10d00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10d10 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
10d20 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
10d30 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
10d40 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  f( pParse->trigS
10d50 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f  tack ) return; /
10d60 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20  * if this is in 
10d70 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76  a trigger */.  v
10d80 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
10d90 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
10da0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
10db0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
10dc0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
10dd0 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f  InTrans ){.    /
10de0 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do Nothing */.
10df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
10e00 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10e10 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  OP_Commit, 0, 0)
10e20 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
10e30 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
10e40 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
10e50 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
10e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
10e70 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29  Boolean(char *z)
10e80 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
10e90 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79  *azTrue[] = { "y
10ea0 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65  es", "on", "true
10eb0 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  " };.  int i;.  
10ec0 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65  if( z[0]==0 ) re
10ed0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73  turn 0;.  if( is
10ee0 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28  digit(z[0]) || (
10ef0 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64  z[0]=='-' && isd
10f00 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20  igit(z[1])) ){. 
10f10 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a     return atoi(z
10f20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
10f30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75  ; i<sizeof(azTru
10f40 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65  e)/sizeof(azTrue
10f50 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
10f60 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
10f70 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d  p(z,azTrue[i])==
10f80 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
10f90 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
10fa0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
10fb0 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
10fc0 67 20 61 73 20 61 20 73 61 66 65 74 79 20 6c 65  g as a safety le
10fd0 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30 20 66  vel.  Return 0 f
10fe0 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66 6f 72  or OFF,.** 1 for
10ff0 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 20 61 6e   ON or NORMAL an
11000 64 20 32 20 66 6f 72 20 46 55 4c 4c 2e 0a 2a 2a  d 2 for FULL..**
11010 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
11020 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
11030 64 20 61 72 65 20 6f 6e 65 20 6c 65 73 73 20 74  d are one less t
11040 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  hat the values t
11050 68 61 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  hat.** should be
11060 20 70 61 73 73 65 64 20 69 6e 74 6f 20 73 71 6c   passed into sql
11070 69 74 65 42 74 72 65 65 53 65 74 53 61 66 65 74  iteBtreeSetSafet
11080 79 4c 65 76 65 6c 28 29 2e 20 20 54 68 65 20 69  yLevel().  The i
11090 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f 20 73 75 70  s done.** to sup
110a0 70 6f 72 74 20 6c 65 67 61 63 79 20 53 51 4c 20  port legacy SQL 
110b0 63 6f 64 65 2e 20 20 54 68 65 20 73 61 66 65 74  code.  The safet
110c0 79 20 6c 65 76 65 6c 20 75 73 65 64 20 74 6f 20  y level used to 
110d0 62 65 20 62 6f 6f 6c 65 61 6e 0a 2a 2a 20 61 6e  be boolean.** an
110e0 64 20 6f 6c 64 65 72 20 73 63 72 69 70 74 73 20  d older scripts 
110f0 6d 61 79 20 68 61 76 65 20 75 73 65 64 20 6e 75  may have used nu
11100 6d 62 65 72 73 20 30 20 66 6f 72 20 4f 46 46 20  mbers 0 for OFF 
11110 61 6e 64 20 31 20 66 6f 72 20 4f 4e 2e 0a 2a 2f  and 1 for ON..*/
11120 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
11130 61 66 65 74 79 4c 65 76 65 6c 28 63 68 61 72 20  afetyLevel(char 
11140 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  *z){.  static co
11150 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
11160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
11170 72 64 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 3b  rd;.    int val;
11180 0a 20 20 7d 20 61 4b 65 79 5b 5d 20 3d 20 7b 0a  .  } aKey[] = {.
11190 20 20 20 20 7b 20 22 6e 6f 22 2c 20 20 20 20 30      { "no",    0
111a0 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 66 66 22 2c   },.    { "off",
111b0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66     0 },.    { "f
111c0 61 6c 73 65 22 2c 20 30 20 7d 2c 0a 20 20 20 20  alse", 0 },.    
111d0 7b 20 22 79 65 73 22 2c 20 20 20 31 20 7d 2c 0a  { "yes",   1 },.
111e0 20 20 20 20 7b 20 22 6f 6e 22 2c 20 20 20 20 31      { "on",    1
111f0 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 75 65 22   },.    { "true"
11200 2c 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 66  ,  1 },.    { "f
11210 75 6c 6c 22 2c 20 20 32 20 7d 2c 0a 20 20 7d 3b  ull",  2 },.  };
11220 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11230 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  z[0]==0 ) return
11240 20 31 3b 0a 20 20 69 66 28 20 69 73 64 69 67 69   1;.  if( isdigi
11250 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d  t(z[0]) || (z[0]
11260 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69 74  =='-' && isdigit
11270 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72  (z[1])) ){.    r
11280 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b 0a 20  eturn atoi(z);. 
11290 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
112a0 73 69 7a 65 6f 66 28 61 4b 65 79 29 2f 73 69 7a  sizeof(aKey)/siz
112b0 65 6f 66 28 61 4b 65 79 5b 30 5d 29 3b 20 69 2b  eof(aKey[0]); i+
112c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
112d0 74 65 53 74 72 49 43 6d 70 28 7a 2c 61 4b 65 79  teStrICmp(z,aKey
112e0 5b 69 5d 2e 7a 57 6f 72 64 29 3d 3d 30 20 29 20  [i].zWord)==0 ) 
112f0 72 65 74 75 72 6e 20 61 4b 65 79 5b 69 5d 2e 76  return aKey[i].v
11300 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
11310 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f   1;.}../*.** Pro
11320 63 65 73 73 20 61 20 70 72 61 67 6d 61 20 73 74  cess a pragma st
11330 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
11340 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20   Pragmas are of 
11350 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  this form:.**.**
11360 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 64 20        PRAGMA id 
11370 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68  = value.**.** Th
11380 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67  e identifier mig
11390 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72  ht also be a str
113a0 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ing.  The value 
113b0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64  is a string, and
113c0 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20  .** identifier, 
113d0 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  or a number.  If
113e0 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72   minusFlag is tr
113f0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ue, then the val
11400 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65  ue is.** a numbe
11410 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63 65  r that was prece
11420 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73  ded by a minus s
11430 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ign..*/.void sql
11440 69 74 65 50 72 61 67 6d 61 28 50 61 72 73 65 20  itePragma(Parse 
11450 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
11460 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
11470 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46  ight, int minusF
11480 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  lag){.  char *zL
11490 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  eft = 0;.  char 
114a0 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73  *zRight = 0;.  s
114b0 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
114c0 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
114d0 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
114e0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
114f0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
11500 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74  .  zLeft = sqlit
11510 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e  eStrNDup(pLeft->
11520 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20  z, pLeft->n);.  
11530 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c  sqliteDequote(zL
11540 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75  eft);.  if( minu
11550 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69  sFlag ){.    zRi
11560 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ght = 0;.    sql
11570 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  iteSetNString(&z
11580 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70  Right, "-", 1, p
11590 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
115a0 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
115b0 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
115c0 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69  qliteStrNDup(pRi
115d0 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e  ght->z, pRight->
115e0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  n);.    sqliteDe
115f0 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20  quote(zRight);. 
11600 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41   }.  if( sqliteA
11610 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11620 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 2c 20   SQLITE_PRAGMA, 
11630 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 29 20 29  zLeft, zRight) )
11640 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
11650 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  (zLeft);.    sql
11660 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b  iteFree(zRight);
11670 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11680 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  . .  /*.  **  PR
11690 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63  AGMA default_cac
116a0 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
116b0 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63  AGMA default_cac
116c0 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  he_size=N.  **. 
116d0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
116e0 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
116f0 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e  urrent persisten
11700 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  t setting for th
11710 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  e.  ** page cach
11720 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c  e size.  The val
11730 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
11740 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
11750 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20  r of.  ** pages 
11760 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
11770 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  e.  The second f
11780 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68  orm sets both th
11790 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70  e current.  ** p
117a0 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76  age cache size v
117b0 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65 72  alue and the per
117c0 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61 63  sistent page cac
117d0 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20  he size value.  
117e0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
117f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
11800 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65    **.  ** The de
11810 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65  fault cache size
11820 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
11830 74 61 2d 76 61 6c 75 65 20 32 20 6f 66 20 70 61  ta-value 2 of pa
11840 67 65 20 31 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ge 1 of the.  **
11850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11860 20 54 68 65 20 63 61 63 68 65 20 73 69 7a 65 20   The cache size 
11870 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20  is actually the 
11880 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
11890 66 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 6d 6f  f.  ** this memo
118a0 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68  ry location.  Th
118b0 65 20 73 69 67 6e 20 6f 66 20 6d 65 74 61 2d 76  e sign of meta-v
118c0 61 6c 75 65 20 32 20 64 65 74 65 72 6d 69 6e 65  alue 2 determine
118d0 73 20 74 68 65 0a 20 20 2a 2a 20 73 79 6e 63 68  s the.  ** synch
118e0 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 2e 20  ronous setting. 
118f0 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
11900 65 20 6d 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e  e means synchron
11910 6f 75 73 20 69 73 20 6f 66 66 0a 20 20 2a 2a 20  ous is off.  ** 
11920 61 6e 64 20 61 20 70 6f 73 69 74 69 76 65 20 76  and a positive v
11930 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68  alue means synch
11940 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2e 0a 20 20  ronous is on..  
11950 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
11960 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65  trICmp(zLeft,"de
11970 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
11980 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
11990 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 43 61  tic VdbeOp getCa
119a0 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20  cheSize[] = {.  
119b0 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
119c0 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20  kie,  0, 2,     
119d0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
119e0 50 5f 41 62 73 56 61 6c 75 65 2c 20 20 20 20 30  P_AbsValue,    0
119f0 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
11a00 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20        { OP_Dup, 
11a10 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
11a20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
11a30 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
11a40 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
11a50 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
11a60 20 20 20 20 20 20 20 20 20 20 30 2c 20 36 2c 20            0, 6, 
11a70 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
11a80 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
11a90 20 20 20 4d 41 58 5f 50 41 47 45 53 2c 30 2c 20     MAX_PAGES,0, 
11aa0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
11ab0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
11ac0 2c 20 20 20 20 20 20 20 20 22 63 61 63 68 65 5f  ,        "cache_
11ad0 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20  size"},.      { 
11ae0 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
11af0 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
11b00 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 66 28 20  .    };.    if( 
11b10 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74  pRight->z==pLeft
11b20 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->z ){.      sql
11b30 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
11b40 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
11b50 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74  tCacheSize), get
11b60 43 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 20 20  CacheSize);.    
11b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
11b80 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74   addr;.      int
11b90 20 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69   size = atoi(zRi
11ba0 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ght);.      if( 
11bb0 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20  size<0 ) size = 
11bc0 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  -size;.      sql
11bd0 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
11be0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
11bf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11c00 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11c10 50 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c  P_Integer, size,
11c20 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11c30 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11c40 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20  _ReadCookie, 0, 
11c50 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  2);.      addr =
11c60 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11c70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11c80 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
11c90 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11ca0 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b 33  OP_Ge, 0, addr+3
11cb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
11cc0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
11cd0 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a  egative, 0, 0);.
11ce0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11cf0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
11d00 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20  ookie, 0, 2);.  
11d10 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
11d20 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
11d30 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  se);.      db->c
11d40 61 63 68 65 5f 73 69 7a 65 20 3d 20 64 62 2d 3e  ache_size = db->
11d50 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f 20 2d  cache_size<0 ? -
11d60 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20 20 20  size : size;.   
11d70 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65     sqliteBtreeSe
11d80 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 61  tCacheSize(db->a
11d90 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62 2d 3e 63  Db[0].pBt, db->c
11da0 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
11db0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a  }.  }else..  /*.
11dc0 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
11dd0 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
11de0 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d  AGMA cache_size=
11df0 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
11e00 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
11e10 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ts the current l
11e20 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72  ocal setting for
11e30 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63   the.  ** page c
11e40 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20  ache size.  The 
11e50 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 63 61  local setting ca
11e60 6e 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 66  n be different f
11e70 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  rom.  ** the per
11e80 73 69 73 74 65 6e 74 20 63 61 63 68 65 20 73 69  sistent cache si
11e90 7a 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 73  ze value that is
11ea0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
11eb0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
11ec0 65 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20 76  e itself.  The v
11ed0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
11ee0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
11ef0 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
11f00 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
11f10 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
11f20 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65 20 6c   form sets the l
11f30 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63  ocal.  ** page c
11f40 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 2e  ache size value.
11f50 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 68    It does not ch
11f60 61 6e 67 65 20 74 68 65 20 70 65 72 73 69 73 74  ange the persist
11f70 65 6e 74 0a 20 20 2a 2a 20 63 61 63 68 65 20 73  ent.  ** cache s
11f80 69 7a 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  ize stored on th
11f90 65 20 64 69 73 6b 20 73 6f 20 74 68 65 20 63 61  e disk so the ca
11fa0 63 68 65 20 73 69 7a 65 20 77 69 6c 6c 20 72 65  che size will re
11fb0 76 65 72 74 0a 20 20 2a 2a 20 74 6f 20 69 74 73  vert.  ** to its
11fc0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
11fd0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
11fe0 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72   is closed and r
11ff0 65 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20  eopened..  ** N 
12000 73 68 6f 75 6c 64 20 62 65 20 61 20 70 6f 73 69  should be a posi
12010 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20  tive integer..  
12020 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
12030 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61  trICmp(zLeft,"ca
12040 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b  che_size")==0 ){
12050 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
12060 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  Op getCacheSize[
12070 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
12080 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c  _ColumnName,  0,
12090 20 30 2c 20 20 20 20 20 20 20 20 22 63 61 63 68   0,        "cach
120a0 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20  e_size"},.      
120b0 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
120c0 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
120d0 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 66  },.    };.    if
120e0 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65  ( pRight->z==pLe
120f0 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 69  ft->z ){.      i
12100 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61  nt size = db->ca
12110 63 68 65 5f 73 69 7a 65 3b 3b 0a 20 20 20 20 20  che_size;;.     
12120 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
12130 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
12140 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12150 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
12160 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20   size, 0);.     
12170 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12180 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
12190 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c  e(getCacheSize),
121a0 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a   getCacheSize);.
121b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
121c0 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69   int size = atoi
121d0 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
121e0 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
121f0 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
12200 20 69 66 28 20 64 62 2d 3e 63 61 63 68 65 5f 73   if( db->cache_s
12210 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d  ize<0 ) size = -
12220 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  size;.      db->
12230 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
12240 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
12250 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
12260 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
12270 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
12280 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
12290 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
122a0 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68  MA default_synch
122b0 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41  ronous.  **  PRA
122c0 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63  GMA default_sync
122d0 68 72 6f 6e 6f 75 73 3d 4f 4e 7c 4f 46 46 7c 4e  hronous=ON|OFF|N
122e0 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20 2a 2a 0a  ORMAL|FULL.  **.
122f0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
12300 6f 72 6d 20 72 65 74 75 72 6e 73 20 74 68 65 20  orm returns the 
12310 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65  persistent value
12320 20 6f 66 20 74 68 65 20 22 73 79 6e 63 68 72 6f   of the "synchro
12330 6e 6f 75 73 22 20 73 65 74 74 69 6e 67 0a 20 20  nous" setting.  
12340 2a 2a 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ** that is store
12350 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
12360 65 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  e.  This is the 
12370 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74  synchronous sett
12380 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a 20 69 73  ing that.  ** is
12390 20 75 73 65 64 20 77 68 65 6e 65 76 65 72 20 74   used whenever t
123a0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
123b0 70 65 6e 65 64 20 75 6e 6c 65 73 73 20 6f 76 65  pened unless ove
123c0 72 72 69 64 64 65 6e 20 62 79 20 61 20 73 65 70  rridden by a sep
123d0 61 72 61 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63  arate.  ** "sync
123e0 68 72 6f 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e  hronous" pragma.
123f0 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
12400 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 70 65  m changes the pe
12410 72 73 69 73 74 65 6e 74 20 61 6e 64 20 74 68 65  rsistent and the
12420 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63  .  ** local sync
12430 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 20  hronous setting 
12440 74 6f 20 74 68 65 20 76 61 6c 75 65 20 67 69 76  to the value giv
12450 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  en..  **.  ** If
12460 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
12470 4f 46 46 2c 20 53 51 4c 69 74 65 20 64 6f 65 73  OFF, SQLite does
12480 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 61 6e 79   not attempt any
12490 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 73   fsync() systems
124a0 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 6d   calls.  ** to m
124b0 61 6b 65 20 73 75 72 65 20 64 61 74 61 20 69 73  ake sure data is
124c0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
124d0 73 6b 2e 20 20 57 72 69 74 65 20 6f 70 65 72 61  sk.  Write opera
124e0 74 69 6f 6e 73 20 61 72 65 20 76 65 72 79 20 66  tions are very f
124f0 61 73 74 2c 0a 20 20 2a 2a 20 62 75 74 20 61 20  ast,.  ** but a 
12500 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 61  power failure ca
12510 6e 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  n leave the data
12520 62 61 73 65 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  base in an incon
12530 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
12540 20 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f   ** If synchrono
12550 75 73 20 69 73 20 4f 4e 20 6f 72 20 4e 4f 52 4d  us is ON or NORM
12560 41 4c 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  AL, SQLite will 
12570 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 73 79  do an fsync() sy
12580 73 74 65 6d 20 63 61 6c 6c 20 74 6f 0a 20 20 2a  stem call to.  *
12590 2a 20 6d 61 6b 65 20 73 75 72 65 20 64 61 74 61  * make sure data
125a0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
125b0 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 65 20  n to disk.  The 
125c0 72 69 73 6b 20 6f 66 20 63 6f 72 72 75 70 74 69  risk of corrupti
125d0 6f 6e 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 61  on due to.  ** a
125e0 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74   power loss in t
125f0 68 69 73 20 6d 6f 64 65 20 69 73 20 6e 65 67 6c  his mode is negl
12600 69 67 69 62 6c 65 20 62 75 74 20 6e 6f 6e 2d 7a  igible but non-z
12610 65 72 6f 2e 20 20 49 66 20 73 79 6e 63 68 72 6f  ero.  If synchro
12620 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 46 55 4c  nous.  ** is FUL
12630 4c 2c 20 65 78 74 72 61 20 66 73 79 6e 63 28 29  L, extra fsync()
12640 73 20 6f 63 63 75 72 20 74 6f 20 72 65 64 75 63  s occur to reduc
12650 65 20 74 68 65 20 72 69 73 6b 20 6f 66 20 63 6f  e the risk of co
12660 72 72 75 70 74 69 6f 6e 20 74 6f 20 6e 65 61 72  rruption to near
12670 0a 20 20 2a 2a 20 7a 65 72 6f 2c 20 62 75 74 20  .  ** zero, but 
12680 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
12690 66 6f 72 6d 61 6e 63 65 20 70 65 6e 61 6c 74 79  formance penalty
126a0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 6d  .  The default m
126b0 6f 64 65 20 69 73 20 4e 4f 52 4d 41 4c 2e 0a 20  ode is NORMAL.. 
126c0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
126d0 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64  StrICmp(zLeft,"d
126e0 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f  efault_synchrono
126f0 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  us")==0 ){.    s
12700 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
12710 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Sync[] = {.     
12720 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
12730 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
12740 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a  "synchronous"},.
12750 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
12760 6f 6f 6b 69 65 2c 20 20 30 2c 20 33 2c 20 20 20  ookie,  0, 3,   
12770 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
12780 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20   OP_Dup,        
12790 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
127a0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c  ,.      { OP_If,
127b0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
127c0 20 20 20 20 20 20 20 30 7d 2c 20 20 2f 2a 20 33         0},  /* 3
127d0 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52   */.      { OP_R
127e0 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32  eadCookie,  0, 2
127f0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
12800 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
12810 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
12820 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
12830 5f 4c 74 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Lt,          0,
12840 20 35 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   5,        0},. 
12850 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
12860 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ,      1, 0,    
12870 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
12880 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
12890 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
128a0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74  .      { OP_Halt
128b0 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
128c0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
128d0 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20  { OP_AddImm,    
128e0 20 2d 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30   -1, 0,        0
128f0 7d 2c 20 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20  },  /* 10 */.   
12900 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
12910 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
12920 20 20 30 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20    0}.    };.    
12930 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70  if( pRight->z==p
12940 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  Left->z ){.     
12950 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
12960 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
12970 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74  v, ArraySize(get
12980 53 79 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b  Sync), getSync);
12990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
129a0 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
129b0 72 2b 33 2c 20 61 64 64 72 2b 31 30 29 3b 0a 20  r+3, addr+10);. 
129c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
129d0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
129e0 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63  int size = db->c
129f0 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20  ache_size;.     
12a00 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
12a10 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
12a20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
12a30 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
12a40 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
12a50 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12a60 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
12a70 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
12a80 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12a90 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
12aa0 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
12ab0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12ac0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
12ad0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12ae0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12af0 5f 4e 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b  _Ne, 0, addr+3);
12b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
12b10 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
12b20 49 6d 6d 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  Imm, MAX_PAGES, 
12b30 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
12b40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12b50 41 62 73 56 61 6c 75 65 2c 20 30 2c 20 30 29 3b  AbsValue, 0, 0);
12b60 0a 20 20 20 20 20 20 64 62 2d 3e 73 61 66 65 74  .      db->safet
12b70 79 5f 6c 65 76 65 6c 20 3d 20 67 65 74 53 61 66  y_level = getSaf
12b80 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74 29  etyLevel(zRight)
12b90 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  +1;.      if( db
12ba0 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d  ->safety_level==
12bb0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
12bc0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12bd0 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20  OP_Negative, 0, 
12be0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65  0);.        size
12bf0 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
12c00 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
12c10 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
12c20 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a  tCookie, 0, 2);.
12c30 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12c40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
12c50 67 65 72 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f  ger, db->safety_
12c60 6c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20  level, 0);.     
12c70 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12c80 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
12c90 2c 20 30 2c 20 33 29 3b 0a 20 20 20 20 20 20 73  , 0, 3);.      s
12ca0 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
12cb0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
12cc0 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f        db->cache_
12cd0 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  size = size;.   
12ce0 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65     sqliteBtreeSe
12cf0 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 61  tCacheSize(db->a
12d00 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62 2d 3e 63  Db[0].pBt, db->c
12d10 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
12d20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
12d30 53 61 66 65 74 79 4c 65 76 65 6c 28 64 62 2d 3e  SafetyLevel(db->
12d40 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62 2d 3e  aDb[0].pBt, db->
12d50 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 3b 0a 20  safety_level);. 
12d60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
12d70 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
12d80 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a   synchronous.  *
12d90 2a 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68  *   PRAGMA synch
12da0 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f  ronous=OFF|ON|NO
12db0 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20 2a 2a 0a 20  RMAL|FULL.  **. 
12dc0 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
12dd0 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
12de0 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f  e of the synchro
12df0 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e  nous flag.  Chan
12e00 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f  ging.  ** the lo
12e10 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e  cal value does n
12e20 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20  ot make changes 
12e30 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  to the disk file
12e40 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65   and the.  ** de
12e50 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c  fault value will
12e60 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65   be restored the
12e70 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64   next time the d
12e80 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20  atabase is.  ** 
12e90 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
12ea0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
12eb0 28 7a 4c 65 66 74 2c 22 73 79 6e 63 68 72 6f 6e  (zLeft,"synchron
12ec0 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ous")==0 ){.    
12ed0 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65  static VdbeOp ge
12ee0 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20  tSync[] = {.    
12ef0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
12f00 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
12f10 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c   "synchronous"},
12f20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
12f30 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
12f40 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
12f50 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
12f60 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
12f70 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12f80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
12f90 67 65 72 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f  ger, db->safety_
12fa0 6c 65 76 65 6c 2d 31 2c 20 30 29 3b 0a 20 20 20  level-1, 0);.   
12fb0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12fc0 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
12fd0 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65  ize(getSync), ge
12fe0 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73  tSync);.    }els
12ff0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  e{.      int siz
13000 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  e = db->cache_si
13010 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ze;.      if( si
13020 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
13030 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 73  ize;.      db->s
13040 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 67 65  afety_level = ge
13050 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69  tSafetyLevel(zRi
13060 67 68 74 29 2b 31 3b 0a 20 20 20 20 20 20 69 66  ght)+1;.      if
13070 28 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  ( db->safety_lev
13080 65 6c 3d 3d 31 20 29 20 73 69 7a 65 20 3d 20 2d  el==1 ) size = -
13090 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  size;.      db->
130a0 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
130b0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
130c0 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
130d0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
130e0 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
130f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
13100 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
13110 6c 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  l(db->aDb[0].pBt
13120 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  , db->safety_lev
13130 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  el);.    }.  }el
13140 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
13150 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
13160 74 72 69 67 67 65 72 5f 6f 76 65 72 68 65 61 64  trigger_overhead
13170 5f 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  _test")==0 ){.  
13180 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
13190 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
131a0 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72    always_code_tr
131b0 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20 31 3b  igger_setup = 1;
131c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
131d0 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72    always_code_tr
131e0 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20 30 3b  igger_setup = 0;
131f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
13200 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
13210 43 6d 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65  Cmp(zLeft, "vdbe
13220 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20  _trace")==0 ){. 
13230 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
13240 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
13250 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
13260 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
13270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13280 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
13290 7e 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63  ~SQLITE_VdbeTrac
132a0 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  e;.    }.  }else
132b0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
132c0 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75  rICmp(zLeft, "fu
132d0 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22  ll_column_names"
132e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
132f0 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
13300 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
13310 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
13320 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
13330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
13340 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
13350 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
13360 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
13370 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
13380 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 73 68 6f  ICmp(zLeft, "sho
13390 77 5f 64 61 74 61 74 79 70 65 73 22 29 3d 3d 30  w_datatypes")==0
133a0 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
133b0 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
133c0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
133d0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 70 6f  s |= SQLITE_Repo
133e0 72 74 54 79 70 65 73 3b 0a 20 20 20 20 7d 65 6c  rtTypes;.    }el
133f0 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
13400 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52  ags &= ~SQLITE_R
13410 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20 20  eportTypes;.    
13420 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
13430 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
13440 4c 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73 65  Left, "result_se
13450 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20 29  t_details")==0 )
13460 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
13470 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
13480 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
13490 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c 74  |= SQLITE_Result
134a0 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c  Details;.    }el
134b0 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  se{.      db->fl
134c0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52  ags &= ~SQLITE_R
134d0 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20  esultDetails;.  
134e0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
134f0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
13500 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63  (zLeft, "count_c
13510 68 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20  hanges")==0 ){. 
13520 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
13530 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
13540 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
13550 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
13560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13570 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
13580 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77  ~SQLITE_CountRow
13590 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
135a0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
135b0 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d  rICmp(zLeft, "em
135c0 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62  pty_result_callb
135d0 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  acks")==0 ){.   
135e0 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
135f0 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
13600 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
13610 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  LITE_NullCallbac
13620 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
13630 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
13640 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c   ~SQLITE_NullCal
13650 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  lback;.    }.  }
13660 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
13670 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
13680 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d   "table_info")==
13690 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  0 ){.    Table *
136a0 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d  pTab;.    pTab =
136b0 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
136c0 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 30 29 3b  (db, zRight, 0);
136d0 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
136e0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64  .      static Vd
136f0 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72  beOp tableInfoPr
13700 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eface[] = {.    
13710 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
13720 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
13730 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20    "cid"},.      
13740 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
13750 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  e,  1, 0,       
13760 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20  "name"},.       
13770 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
13780 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  2, 0,       "
13790 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  type"},.        
137a0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
137b0 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22 6e    3, 0,       "n
137c0 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20  otnull"},.      
137d0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
137e0 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20 20  e,  4, 0,       
137f0 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20  "dflt_value"},. 
13800 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
13810 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
13820 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
13830 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c  , ArraySize(tabl
13840 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74  eInfoPreface), t
13850 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29  ableInfoPreface)
13860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69  ;.      sqliteVi
13870 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
13880 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
13890 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
138a0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
138b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
138c0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
138d0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
138e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
138f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13900 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
13910 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
13920 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
13930 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
13940 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
13950 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13960 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13970 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
13980 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
13990 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
139a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
139b0 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
139c0 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  ? pTab->aCol[i].
139d0 7a 54 79 70 65 20 3a 20 22 6e 75 6d 65 72 69 63  zType : "numeric
139e0 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
139f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
13a00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
13a10 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  eger, pTab->aCol
13a20 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b  [i].notNull, 0);
13a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13a40 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13a50 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
13a60 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
13a70 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
13a80 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  pTab->aCol[i].zD
13a90 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  flt, P3_STATIC);
13aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
13ab0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
13ac0 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a  allback, 5, 0);.
13ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13ae0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
13af0 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
13b00 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d  , "index_info")=
13b10 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
13b20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
13b30 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78   *pTab;.    pIdx
13b40 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64   = sqliteFindInd
13b50 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 30  ex(db, zRight, 0
13b60 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
13b70 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
13b80 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f  VdbeOp tableInfo
13b90 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20  Preface[] = {.  
13ba0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
13bb0 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
13bc0 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20      "seqno"},.  
13bd0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
13be0 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
13bf0 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20      "cid"},.    
13c00 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
13c10 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20  ame,  2, 0,     
13c20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
13c30 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
13c40 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49  .      pTab = pI
13c50 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  dx->pTable;.    
13c60 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
13c70 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
13c80 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ze(tableInfoPref
13c90 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50  ace), tableInfoP
13ca0 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66  reface);.      f
13cb0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
13cc0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
13cd0 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20         int cnum 
13ce0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
13cf0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
13d00 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
13d10 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
13d20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13d30 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13d40 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20  _Integer, cnum, 
13d50 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
13d60 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13d70 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
13d80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13d90 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d   pTab->nCol>cnum
13da0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
13db0 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
13dc0 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
13dd0 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33  [cnum].zName, P3
13de0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
13df0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
13e00 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
13e10 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 3, 0);.      }
13e20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
13e30 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
13e40 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65  Cmp(zLeft, "inde
13e50 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20  x_list")==0 ){. 
13e60 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
13e70 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
13e80 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
13e90 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
13ea0 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  zRight, 0);.    
13eb0 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
13ec0 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
13ed0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
13ee0 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e     pIdx = pTab->
13ef0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
13f00 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70 49    if( pTab && pI
13f10 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
13f20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74  i = 0; .      st
13f30 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65  atic VdbeOp inde
13f40 78 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d  xListPreface[] =
13f50 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
13f60 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
13f70 30 2c 20 20 20 20 20 20 20 22 73 65 71 22 7d 2c  0,       "seq"},
13f80 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
13f90 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
13fa0 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
13fb0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
13fc0 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
13fd0 20 20 20 20 20 20 22 75 6e 69 71 75 65 22 7d 2c        "unique"},
13fe0 0a 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20  .      };..     
13ff0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
14000 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
14010 65 28 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  e(indexListPrefa
14020 63 65 29 2c 20 69 6e 64 65 78 4c 69 73 74 50 72  ce), indexListPr
14030 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 77 68  eface);.      wh
14040 69 6c 65 28 70 49 64 78 29 7b 0a 20 20 20 20 20  ile(pIdx){.     
14050 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
14060 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
14070 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
14080 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
14090 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
140a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
140b0 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
140c0 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
140d0 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
140e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
140f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
14100 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e  nteger, pIdx->on
14110 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20  Error!=OE_None, 
14120 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
14130 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
14140 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30  P_Callback, 3, 0
14150 29 3b 0a 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a  );.        ++i;.
14160 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 70          pIdx = p
14170 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Idx->pNext;.    
14180 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
14190 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  e..#ifndef NDEBU
141a0 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  G.  if( sqliteSt
141b0 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61  rICmp(zLeft, "pa
141c0 72 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20  rser_trace")==0 
141d0 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
141e0 69 64 20 73 71 6c 69 74 65 50 61 72 73 65 72 54  id sqliteParserT
141f0 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72  race(FILE*, char
14200 20 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74   *);.    if( get
14210 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
14220 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50  ){.      sqliteP
14230 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75  arserTrace(stdou
14240 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a  t, "parser: ");.
14250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14260 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
14270 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ce(0, 0);.    }.
14280 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
14290 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
142a0 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65  Cmp(zLeft, "inte
142b0 67 72 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30  grity_check")==0
142c0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
142d0 64 62 65 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20  dbeOp checkDb[] 
142e0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  = {.      { OP_S
142f0 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30  etInsert,   0, 0
14300 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20  ,        "2"},. 
14310 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
14320 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  r,     0, 0,    
14330 20 20 20 20 30 7d 2c 20 20 20 0a 20 20 20 20 20      0},   .     
14340 20 7b 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20   { OP_OpenRead, 
14350 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
14360 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
14370 65 77 69 6e 64 2c 20 20 20 20 20 20 30 2c 20 37  ewind,      0, 7
14380 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
14390 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
143a0 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20       0, 3,      
143b0 20 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f    0},    /* 4 */
143c0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49  .      { OP_SetI
143d0 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20  nsert,   0, 0,  
143e0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
143f0 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
14400 20 20 30 2c 20 34 2c 20 20 20 20 20 20 20 20 30    0, 4,        0
14410 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
14420 74 65 67 72 69 74 79 43 6b 2c 20 30 2c 20 30 2c  tegrityCk, 0, 0,
14430 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
14440 2a 20 37 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 7 */.      { O
14450 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
14460 2c 20 30 2c 20 20 20 20 20 20 20 20 22 69 6e 74  , 0,        "int
14470 65 67 72 69 74 79 5f 63 68 65 63 6b 22 7d 2c 0a  egrity_check"},.
14480 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
14490 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
144a0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
144b0 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
144c0 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 22 32   1, 0,        "2
144d0 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  "},.      { OP_I
144e0 6e 74 65 67 65 72 2c 20 20 20 20 20 31 2c 20 30  nteger,     1, 0
144f0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
14500 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 52 65 61 64     { OP_OpenRead
14510 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20  ,    1, 2,      
14520 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
14530 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 31 2c  _Rewind,      1,
14540 20 31 37 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20   17,       0},. 
14550 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
14560 2c 20 20 20 20 20 20 31 2c 20 33 2c 20 20 20 20  ,      1, 3,    
14570 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 34      0},    /* 14
14580 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
14590 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c 20 30  etInsert,   1, 0
145a0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
145b0 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
145c0 20 20 20 20 20 31 2c 20 31 34 2c 20 20 20 20 20       1, 14,     
145d0 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
145e0 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 31 2c  _IntegrityCk, 1,
145f0 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   1,        0},  
14600 20 20 2f 2a 20 31 37 20 2a 2f 0a 20 20 20 20 20    /* 17 */.     
14610 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
14620 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
14630 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73  0},.    };.    s
14640 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
14650 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
14660 63 68 65 63 6b 44 62 29 2c 20 63 68 65 63 6b 44  checkDb), checkD
14670 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b  b);.  }else..  {
14680 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  }.  sqliteFree(z
14690 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  Left);.  sqliteF
146a0 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a     ree(zRight);.}.