/ Hex Artifact Content
Login

Artifact da21ffe7daeea576ebfbeb2f96ac0f99fa6b9a09:


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 42 45 47 49 4e 20 54 52 41  **     BEGIN TRA
02b0: 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20  NSACTION.**     
02c0: 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f  COMMIT.**     RO
02d0: 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52  LLBACK.**     PR
02e0: 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  AGMA.**.** $Id: 
02f0: 62 75 69 6c 64 2e 63 2c 76 20 31 2e 31 34 32 20  build.c,v 1.142 
0300: 32 30 30 33 2f 30 34 2f 30 36 20 32 30 3a 35 32  2003/04/06 20:52
0310: 3a 33 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :32 drh Exp $.*/
0320: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0330: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0340: 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a   <ctype.h>../*.*
0350: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0360: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
0370: 6e 65 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  new SQL statemen
0380: 74 20 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74  t is beginning t
0390: 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20  o.** be parsed. 
03a0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
03b0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
03c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 65 65  the database nee
03d0: 64 73 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64  ds.** to be read
03e0: 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45   from the SQLITE
03f0: 5f 4d 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49  _MASTER and SQLI
0400: 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74  TE_TEMP_MASTER t
0410: 61 62 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20  ables..** If it 
0420: 64 6f 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20  does, then read 
0430: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
0440: 74 65 42 65 67 69 6e 50 61 72 73 65 28 50 61 72  teBeginParse(Par
0450: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
0460: 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20  explainFlag){.  
0470: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
0480: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73  rse->db;.  pPars
0490: 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70  e->explain = exp
04a0: 6c 61 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28  lainFlag;.  if((
04b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
04c0: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d  TE_Initialized)=
04d0: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e  =0 && pParse->in
04e0: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
04f0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
0500: 49 6e 69 74 28 64 62 2c 20 26 70 50 61 72 73 65  Init(db, &pParse
0510: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
0520: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
0530: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  K ){.      pPars
0540: 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
0550: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0560: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
0570: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 66  *.** This is a f
0580: 61 6b 65 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f  ake callback pro
0590: 63 65 64 75 72 65 20 75 73 65 64 20 77 68 65 6e  cedure used when
05a0: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 69   sqlite_exec() i
05b0: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 77 69 74  s.** invoked wit
05c0: 68 20 61 20 4e 55 4c 4c 20 63 61 6c 6c 62 61 63  h a NULL callbac
05d0: 6b 20 70 6f 69 6e 74 65 72 2e 20 20 49 66 20 77  k pointer.  If w
05e0: 65 20 70 61 73 73 20 61 20 4e 55 4c 4c 20 63 61  e pass a NULL ca
05f0: 6c 6c 62 61 63 6b 0a 2a 2a 20 70 6f 69 6e 74 65  llback.** pointe
0600: 72 20 69 6e 74 6f 20 73 71 6c 69 74 65 56 64 62  r into sqliteVdb
0610: 65 45 78 65 63 28 29 20 69 74 20 77 69 6c 6c 20  eExec() it will 
0620: 72 65 74 75 72 6e 20 61 74 20 65 76 65 72 79 20  return at every 
0630: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  OP_Callback,.** 
0640: 77 68 69 63 68 20 77 65 20 64 6f 20 6e 6f 74 20  which we do not 
0650: 77 61 6e 74 20 69 74 20 74 6f 20 64 6f 2e 20 20  want it to do.  
0660: 53 6f 20 77 65 20 73 75 62 73 74 69 74 75 74 65  So we substitute
0670: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0680: 69 73 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 20  is.** procedure 
0690: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
06a0: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
06b0: 69 6e 74 20 66 61 6b 65 43 61 6c 6c 62 61 63 6b  int fakeCallback
06c0: 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20  (void *NotUsed, 
06d0: 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 2a 61 7a  int n, char **az
06e0: 31 2c 20 63 68 61 72 20 2a 2a 61 7a 32 29 7b 0a  1, char **az2){.
06f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
0700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0710: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
0720: 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73  r a single SQL s
0730: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65  tatement has bee
0740: 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20  n.** parsed and 
0750: 77 65 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75  we want to execu
0760: 74 65 20 74 68 65 20 56 44 42 45 20 63 6f 64 65  te the VDBE code
0770: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a   to implement .*
0780: 2a 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  * that statement
0790: 2e 20 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20  .  Prior action 
07a0: 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20  routines should 
07b0: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
07c0: 63 6f 6e 73 74 72 75 63 74 65 64 20 56 44 42 45  constructed VDBE
07d0: 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
07e0: 77 6f 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20  work of the SQL 
07f0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
0800: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
0810: 68 61 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  has to execute t
0820: 68 65 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a  he VDBE code..**
0830: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0840: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0850: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0860: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0870: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0880: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0890: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 65 63 28  void sqliteExec(
08a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
08b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
08c0: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a  E_OK;.  sqlite *
08d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
08e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
08f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
0900: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
0910: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c  oid*,int,char**,
0920: 63 68 61 72 2a 2a 29 3b 0a 0a 20 20 69 66 28 20  char**);..  if( 
0930: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
0940: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
0950: 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 70 50 61   xCallback = pPa
0960: 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 3b 0a  rse->xCallback;.
0970: 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 3d    if( xCallback=
0980: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 75 73  =0 && pParse->us
0990: 65 43 61 6c 6c 62 61 63 6b 20 29 20 78 43 61 6c  eCallback ) xCal
09a0: 6c 62 61 63 6b 20 3d 20 66 61 6b 65 43 61 6c 6c  lback = fakeCall
09b0: 62 61 63 6b 3b 0a 20 20 69 66 28 20 76 20 26 26  back;.  if( v &&
09c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
09d0: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
09e0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
09f0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
0a00: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
0a10: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
0a20: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
0a30: 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ce);.    sqliteV
0a40: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
0a50: 78 43 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73  xCallback, pPars
0a60: 65 2d 3e 70 41 72 67 2c 20 70 50 61 72 73 65 2d  e->pArg, pParse-
0a70: 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 69  >explain);.    i
0a80: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61  f( pParse->useCa
0a90: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
0aa0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
0ab0: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ain ){.        r
0ac0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69  c = sqliteVdbeLi
0ad0: 73 74 28 76 29 3b 0a 20 20 20 20 20 20 20 20 64  st(v);.        d
0ae0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d  b->next_cookie =
0af0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65   db->aDb[0].sche
0b00: 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
0b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0b20: 73 71 6c 69 74 65 56 64 62 65 45 78 65 63 28 76  sqliteVdbeExec(v
0b30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0b40: 20 72 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65   rc = sqliteVdbe
0b50: 46 69 6e 61 6c 69 7a 65 28 76 2c 20 26 70 50 61  Finalize(v, &pPa
0b60: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  rse->zErrMsg);. 
0b70: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 70 50       if( rc ) pP
0b80: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0b90: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
0ba0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  e = 0;.      pPa
0bb0: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
0bc0: 20 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61      if( rc ) pPa
0bd0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
0be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
0bf0: 61 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73  arse->rc = pPars
0c00: 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45  e->nErr ? SQLITE
0c10: 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
0c20: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
0c30: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0c40: 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Set = 0;.    pPa
0c50: 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66  rse->schemaVerif
0c60: 69 65 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ied = 0;.  }else
0c70: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65   if( pParse->use
0c80: 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20  Callback==0 ){. 
0c90: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
0ca0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
0cb0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
0cc0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0cd0: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
0ce0: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
0cf0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
0d00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0d10: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0d20: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d30: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0d40: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0d50: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0d60: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0d70: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
0d80: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0d90: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
0da0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0db0: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0dc0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
0dd0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
0de0: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
0df0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
0e00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
0e10: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
0e20: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
0e30: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
0e40: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
0e50: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
0e60: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
0e70: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 44  sqliteStrICmp(zD
0e80: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
0e90: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
0ea0: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
0eb0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
0ec0: 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73  b->aDb[j].tblHas
0ed0: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
0ee0: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
0ef0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
0f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
0f10: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
0f20: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
0f30: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0f40: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
0f50: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
0f60: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
0f70: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  hat index..** Re
0f80: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
0f90: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78   found..*/.Index
0fa0: 20 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65   *sqliteFindInde
0fb0: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
0fc0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
0fd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
0fe0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
0ff0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
1000: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1010: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1020: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1030: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1040: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1050: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
1060: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
1070: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
1080: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
1090: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
10a0: 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  teHashFind(&db->
10b0: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
10c0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
10d0: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
10e0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
10f0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1100: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1110: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1120: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1130: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1140: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
1150: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
1160: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1170: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
1180: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
1190: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
11a0: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
11b0: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
11c0: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
11d0: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
11e0: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
11f0: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
1200: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
1210: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1220: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1230: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1240: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
1250: 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pOld;..  assert(
1260: 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61   db!=0 && p->zNa
1270: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  me!=0 );.  pOld 
1280: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1290: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
12a0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e  Db].idxHash, p->
12b0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
12e0: 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  )+1, 0);.  if( p
12f0: 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d  Old!=0 && pOld!=
1300: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 48  p ){.    sqliteH
1310: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
1320: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
1330: 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c  sh, pOld->zName,
1340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1350: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c        strlen(pOl
1360: 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c  d->zName)+1, pOl
1370: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1380: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
1390: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
13a0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  en index from it
13b0: 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  s table, then re
13c0: 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  move.** the inde
13d0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
13e0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
13f0: 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a  free its memory.
1400: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ** structures..*
1410: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c  /.void sqliteUnl
1420: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
1430: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1440: 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1450: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
1460: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
1470: 65 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ex ){.    pIndex
1480: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1490: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
14a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
14b0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ndex *p;.    for
14c0: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
14d0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
14e0: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
14f0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
1500: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
1510: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
1520: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
1530: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1550: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1560: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  b, pIndex);.}../
1570: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
1580: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
1590: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
15a0: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
15b0: 20 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20   of.** database 
15c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
15d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15e0: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
15f0: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
1600: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
1610: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
1620: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
1630: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
1640: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
1650: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
1660: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1670: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  on..**.** If iDb
1680: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
1690: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
16a0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
16b0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
16c0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
16d0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
16e0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
16f0: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
1700: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
1710: 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ates..*/.void sq
1720: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
1730: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1740: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1750: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1760: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1770: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1780: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1790: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
17a0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
17b0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
17c0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
17d0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
17e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
17f0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1800: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1810: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1820: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1830: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1840: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69     sqliteHashIni
1850: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
1860: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
1870: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
1880: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 70  liteHashClear(&p
1890: 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20  Db->aFKey);.    
18a0: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
18b0: 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  &pDb->idxHash);.
18c0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
18d0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
18e0: 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp2); pElem; pE
18f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
1900: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
1910: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
1920: 67 65 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68  ger = sqliteHash
1930: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
1940: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
1950: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
1960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1970: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
1980: 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48  p2);.    sqliteH
1990: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
19a0: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
19b0: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
19c0: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
19d0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
19e0: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
19f0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
1a00: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
1a10: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
1a20: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
1a30: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
1a40: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
1a50: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
1a60: 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65     sqliteHashCle
1a70: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
1a80: 64 62 2d 3e 61 44 62 5b 69 5d 2e 66 6c 61 67 73  db->aDb[i].flags
1a90: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74   &= ~SQLITE_Init
1aa0: 69 61 6c 69 7a 65 64 3b 0a 20 20 20 20 69 66 28  ialized;.    if(
1ab0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
1ac0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
1ad0: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
1ae0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
1af0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
1b00: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
1b10: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
1b20: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
1b30: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
1b40: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
1b50: 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20  emove then from 
1b60: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
1b70: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
1b80: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
1b90: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
1ba0: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
1bb0: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
1bc0: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
1bd0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
1be0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
1bf0: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
1c00: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
1c10: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
1c20: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
1c30: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
1c40: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
1c50: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
1c60: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30  b->aDb[i].pBt==0
1c70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c80: 46 72 65 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  Free(db->aDb[i].
1c90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 64 62  zName);.      db
1ca0: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[i].zName =
1cb0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
1cc0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
1cd0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
1ce0: 62 2d 3e 61 44 62 5b 6a 2b 2b 5d 20 3d 20 64 62  b->aDb[j++] = db
1cf0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aDb[i];.    }.
1d00: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62    }.  memset(&db
1d10: 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62  ->aDb[j], 0, (db
1d20: 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28  ->nDb-j)*sizeof(
1d30: 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20  db->aDb[j]));.  
1d40: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
1d50: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
1d60: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
1d70: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
1d80: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
1d90: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
1da0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
1db0: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ]));.    sqliteF
1dc0: 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20  ree(db->aDb);.  
1dd0: 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
1de0: 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d  aDbStatic;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1e00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
1e10: 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
1e20: 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74  ck occurs.  If t
1e30: 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68  here were.** sch
1e40: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
1e50: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1e60: 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65  on, then we have
1e70: 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a   to reset the.**
1e80: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
1e90: 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64  ables and reload
1ea0: 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e   them from disk.
1eb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
1ec0: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
1ed0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
1ee0: 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  b){.  if( db->fl
1ef0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
1f00: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
1f10: 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74    sqliteResetInt
1f20: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
1f30: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
1f40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1f50: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
1f60: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
1f70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
1f80: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
1f90: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
1fa0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65   db->aDb[0].sche
1fb0: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  ma_cookie = db->
1fc0: 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64  next_cookie;.  d
1fd0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1fe0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
1ff0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  s;.}../*.** Remo
2000: 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61  ve the memory da
2010: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ta structures as
2020: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2030: 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65  e given.** Table
2040: 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  .  No changes ar
2050: 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62  e made to disk b
2060: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
2070: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2080: 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20  ne just deletes 
2090: 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
20a0: 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  re.  It does not
20b0: 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74   unlink.** the t
20c0: 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74  able data struct
20d0: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ure from the has
20e0: 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f  h table.  Nor do
20f0: 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20  es it remove.** 
2100: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f  foreign keys fro
2110: 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b  m the sqlite.aFK
2120: 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ey hash table.  
2130: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
2140: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
2150: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
2160: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
2170: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
2180: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
2190: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   table..**.** In
21a0: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
21b0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
21c0: 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  are unlinked fro
21d0: 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61  m the "db".** da
21e0: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
21f0: 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62  db!=NULL.  If db
2200: 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20  ==NULL, indices 
2210: 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74  attached to.** t
2220: 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c  he table are del
2230: 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  eted, but it is 
2240: 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76  assumed they hav
2250: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  e already been.*
2260: 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76  * unlinked..*/.v
2270: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
2280: 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62  Table(sqlite *db
2290: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
22a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64  {.  int i;.  Ind
22b0: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
22c0: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
22d0: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a  y, *pNextFKey;..
22e0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
22f0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
2300: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
2310: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2320: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
2330: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
2340: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
2350: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
2360: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
2370: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
2380: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
2390: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61  pIndex->iDb==pTa
23a0: 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61  ble->iDb || (pTa
23b0: 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70  ble->iDb==0 && p
23c0: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29  Index->iDb==1) )
23d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
23e0: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
23f0: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
2400: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
2410: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
2420: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
2430: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
2440: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
2450: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
2460: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
2470: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
2480: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
2490: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
24a0: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
24b0: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
24c0: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
24d0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
24e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
24f0: 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ->iDb<db->nDb );
2500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2510: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
2520: 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62  >aDb[pTable->iDb
2530: 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20  ].aFKey,.       
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
2560: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
2570: 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a  o)+1)!=pFKey );.
2580: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2590: 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FKey);.  }..  /*
25a0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
25b0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
25c0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  lf..  */.  for(i
25d0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
25e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
25f0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2600: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
2610: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2620: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2630: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
2640: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2650: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20  Col[i].zType);. 
2660: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
2670: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
2680: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2690: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71  ble->aCol);.  sq
26a0: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
26b0: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
26c0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
26d0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
26e0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
26f0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
2700: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
2710: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
2720: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
2730: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
2740: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
2750: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 73 74  eign keys..*/.st
2760: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2770: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
2780: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
2790: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 54 61   Table *p){.  Ta
27a0: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 46 4b 65  ble *pOld;.  FKe
27b0: 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20  y *pF1, *pF2;.  
27c0: 69 6e 74 20 69 20 3d 20 70 2d 3e 69 44 62 3b 0a  int i = p->iDb;.
27d0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
27e0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  );.  pOld = sqli
27f0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2800: 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c 48 61 73 68  ->aDb[i].tblHash
2810: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
2820: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
2830: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  0);.  assert( pO
2840: 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70  ld==0 || pOld==p
2850: 20 29 3b 0a 20 20 66 6f 72 28 70 46 31 3d 70 2d   );.  for(pF1=p-
2860: 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31  >pFKey; pF1; pF1
2870: 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pF1->pNextFrom)
2880: 7b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20  {.    int nTo = 
2890: 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29  strlen(pF1->zTo)
28a0: 20 2b 20 31 3b 0a 20 20 20 20 70 46 32 20 3d 20   + 1;.    pF2 = 
28b0: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
28c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79  db->aDb[i].aFKey
28d0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  , pF1->zTo, nTo)
28e0: 3b 0a 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70  ;.    if( pF2==p
28f0: 46 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  F1 ){.      sqli
2900: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
2910: 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20  ->aDb[i].aFKey, 
2920: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  pF1->zTo, nTo, p
2930: 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20  F1->pNextTo);.  
2940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
2950: 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32  hile( pF2 && pF2
2960: 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29  ->pNextTo!=pF1 )
2970: 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74  { pF2=pF2->pNext
2980: 54 6f 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  To; }.      if( 
2990: 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pF2 ){.        p
29a0: 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46  F2->pNextTo = pF
29b0: 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20  1->pNextTo;.    
29c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
29d0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
29e0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
29f0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  ** Construct the
2a00: 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72 20   name of a user 
2a10: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66  table or index f
2a20: 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a  rom a token..**.
2a30: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
2a40: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62 74   the name is obt
2a50: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2a60: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
2a70: 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  st.** be freed b
2a80: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2a90: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
2aa0: 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65  *sqliteTableName
2ab0: 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20  FromToken(Token 
2ac0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
2ad0: 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  *zName = sqliteS
2ae0: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
2af0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71   pName->n);.  sq
2b00: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d  liteDequote(zNam
2b10: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61  e);.  return zNa
2b20: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  me;.}../*.** Gen
2b30: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6f 70  erate code to op
2b40: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
2b50: 74 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te master table.
2b60: 20 20 54 68 65 20 74 61 62 6c 65 0a 2a 2a 20 6f    The table.** o
2b70: 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 53 51  pened will be SQ
2b80: 4c 49 54 45 5f 4d 41 53 54 45 52 20 66 6f 72 20  LITE_MASTER for 
2b90: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
2ba0: 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  s and .** SQLITE
2bb0: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 66 6f 72  _TEMP_MASTER for
2bc0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2bd0: 73 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  s.  The table is
2be0: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 63 75   opened.** on cu
2bf0: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
2c00: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
2c10: 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69  Table(Vdbe *v, i
2c20: 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 73 71  nt isTemp){.  sq
2c30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2c40: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54   OP_Integer, isT
2c50: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  emp, 0);.  sqlit
2c60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2c70: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 32  _OpenWrite, 0, 2
2c80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  );.}../*.** Begi
2c90: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
2ca0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
2cb0: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
2cc0: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
2cd0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
2ce0: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
2cf0: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
2d00: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
2d10: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
2d20: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2d30: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
2d40: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
2d50: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
2d60: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
2d70: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
2d80: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
2d90: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a  le name.  The.**
2da0: 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73   pStart token is
2db0: 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20   the CREATE and 
2dc0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62  pName is the tab
2dd0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73  le name.  The is
2de0: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
2df0: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
2e00: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
2e10: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
2e20: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
2e30: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
2e40: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
2e50: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
2e60: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
2e70: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
2e80: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
2e90: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
2ea0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
2eb0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
2ec0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
2ed0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
2ee0: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
2ef0: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
2f00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
2f10: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
2f20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2f30: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
2f40: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
2f50: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
2f60: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2f70: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
2f80: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
2f90: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
2fa0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
2fb0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2fc0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 45  ent, the sqliteE
2fd0: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
2fe0: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
2ff0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
3000: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
3010: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
3020: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
3030: 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 0a 20  iteStartTable(. 
3040: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3050: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
3060: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
3070: 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65  pStart,   /* The
3080: 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20   "CREATE" token 
3090: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
30a0: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
30b0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 74   table or view t
30c0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 69 6e  o create */.  in
30d0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
30e0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
30f0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
3100: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20 20  /.  int isView  
3110: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3120: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
3130: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3140: 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70  able;.  Index *p
3150: 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  Idx;.  char *zNa
3160: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  me;.  sqlite *db
3170: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
3180: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
3190: 69 44 62 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  iDb;..  pParse->
31a0: 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70  sFirstToken = *p
31b0: 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d  Start;.  zName =
31c0: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
31d0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
31e0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
31f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3200: 20 70 50 61 72 73 65 2d 3e 69 44 62 3d 3d 31 20   pParse->iDb==1 
3210: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
3220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3230: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
3240: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
3250: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
3260: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75  ;.  if( sqliteAu
3270: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
3280: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
3290: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
32a0: 6d 70 29 2c 20 30 29 20 29 7b 0a 20 20 20 20 73  mp), 0) ){.    s
32b0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
32c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
32d0: 7d 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  }.  {.    int co
32e0: 64 65 3b 0a 20 20 20 20 69 66 28 20 69 73 56 69  de;.    if( isVi
32f0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
3300: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
3310: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
3320: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
3330: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3340: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
3350: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
3360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
3370: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
3380: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
3390: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
33a0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
33b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33c0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
33d0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
33e0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
33f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
3400: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
3410: 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 29   code, zName, 0)
3420: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3430: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
3440: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
3450: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 0a 20  .  }.#endif. .. 
3460: 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e   /* Before tryin
3470: 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65  g to create a te
3480: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d  mporary table, m
3490: 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72  ake sure the Btr
34a0: 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64  ee for.  ** hold
34b0: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
34c0: 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20  bles is open..  
34d0: 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  */.  if( isTemp 
34e0: 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  && db->aDb[1].pB
34f0: 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
3500: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
3510: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 42  int rc = sqliteB
3520: 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 4d  treeOpen(0, 0, M
3530: 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
3540: 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
3550: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3560: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
3570: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
3580: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e  se->zErrMsg, "un
3590: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
35a0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
35b0: 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
35c0: 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
35d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 2c  mporary tables",
35e0: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
35f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3600: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3610: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
3620: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
3630: 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
3640: 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e  sqliteBtreeBegin
3650: 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d  Trans(db->aDb[1]
3660: 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  .pBt);.      if(
3670: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3680: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3690: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
36a0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e  se->zErrMsg, "un
36b0: 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72  able to get a wr
36c0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20  ite lock on ".  
36d0: 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d          "the tem
36e0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
36f0: 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  file", 0);.     
3700: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3710: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
3720: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
3730: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
3740: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
3750: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
3760: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
3770: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
3780: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
3790: 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  me.  Issue an er
37a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 69  ror message if i
37b0: 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t does..  **.  *
37c0: 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d 72  * If we are re-r
37d0: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
37e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
37f0: 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68 65  ecause of a sche
3800: 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 61  ma.  ** change a
3810: 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e 65  nd a new permane
3820: 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e  nt table is foun
3830: 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f 6c  d whose name col
3840: 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a 20  lides with.  ** 
3850: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d 70  an existing temp
3860: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 61  orary table, tha
3870: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f  t is not an erro
3880: 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65  r..  */.  pTable
3890: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
38a0: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
38b0: 3b 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d 70  ;.  iDb = isTemp
38c0: 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69   ? 1 : pParse->i
38d0: 44 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  Db;.  if( pTable
38e0: 21 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d 3e  !=0 && (pTable->
38f0: 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21 70 50 61  iDb==iDb || !pPa
3900: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20 29  rse->initFlag) )
3910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
3920: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3930: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
3940: 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ", 0, pName->z, 
3950: 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20  pName->n,.      
3960: 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73    " already exis
3970: 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ts", 0, 0);.    
3980: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
3990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
39a0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
39b0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  n;.  }.  if( (pI
39c0: 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  dx = sqliteFindI
39d0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
39e0: 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  0))!=0 &&.      
39f0: 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d 3d      (pIdx->iDb==
3a00: 30 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e  0 || !pParse->in
3a10: 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73  itFlag) ){.    s
3a20: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
3a30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
3a40: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
3a50: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
3a60: 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61  d ", .       zNa
3a70: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
3a80: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3a90: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3aa0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
3ab0: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
3ac0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
3ad0: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
3ae0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
3af0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
3b00: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
3b10: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  n;.  }.  pTable-
3b20: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
3b30: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
3b40: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43   0;.  pTable->aC
3b50: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
3b60: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
3b70: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
3b80: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44   0;.  pTable->iD
3b90: 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70  b = iDb;.  if( p
3ba0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3bb0: 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54   ) sqliteDeleteT
3bc0: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
3bd0: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
3be0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3bf0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
3c00: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
3c10: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
3c20: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
3c30: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
3c40: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
3c50: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
3c60: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
3c70: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
3c80: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
3c90: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
3ca0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
3cb0: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
3cc0: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
3cd0: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
3ce0: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
3cf0: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
3d00: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
3d10: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
3d20: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
3d30: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
3d40: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
3d50: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
3d60: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
3d70: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
3d80: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
3d90: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
3da0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
3db0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
3dc0: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
3dd0: 61 67 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  ag && (v = sqlit
3de0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
3df0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
3e00: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
3e10: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3e20: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 69 66   isTemp);.    if
3e30: 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
3e40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3e50: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
3e60: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
3e70: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
3e80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3e90: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
3ea0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   1);.    }.    s
3eb0: 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54  qliteOpenMasterT
3ec0: 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b  able(v, isTemp);
3ed0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3ee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
3ef0: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
3f00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3f10: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
3f20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
3f30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
3f40: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
3f50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3f60: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
3f70: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
3f80: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
3f90: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
3fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
3fb0: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
3fc0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
3fd0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
3fe0: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
3ff0: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
4000: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
4010: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4020: 6e 74 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74  nt.  sqliteStart
4030: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
4040: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
4050: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
4060: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
4070: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
4080: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
4090: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
40a0: 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  eAddColumn(Parse
40b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
40c0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
40d0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
40e0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43  char *z = 0;.  C
40f0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
4100: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4110: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4120: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
4130: 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70  SetNString(&z, p
4140: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
4150: 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n, 0);.  if( z==
4160: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
4170: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a  liteDequote(z);.
4180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4190: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
41a0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
41b0: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
41c0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
41d0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
41e0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
41f0: 4d 73 67 2c 20 22 64 75 70 6c 69 63 61 74 65 20  Msg, "duplicate 
4200: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20  column name: ", 
4210: 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  z, 0);.      pPa
4220: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4230: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
4240: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
4250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4260: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
4270: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
4280: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
4290: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
42a0: 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e  ( p->aCol, (p->n
42b0: 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d  Col+8)*sizeof(p-
42c0: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  >aCol[0]));.    
42d0: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65  if( aNew==0 ) re
42e0: 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  turn;.    p->aCo
42f0: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
4300: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
4310: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
4320: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
4330: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
4340: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
4350: 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74   z;.  pCol->sort
4360: 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
4370: 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  O_NUM;.  p->nCol
4380: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
4390: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
43a0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
43b0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
43c0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
43d0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
43e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
43f0: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
4400: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
4410: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
4420: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
4430: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
4440: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
4450: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
4460: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
4470: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
4480: 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c  sqliteAddNotNull
4490: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
44a0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
44b0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
44c0: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
44d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
44e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
44f0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4500: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
4510: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
4520: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
4530: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4540: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4550: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4560: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4570: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4580: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4590: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
45a0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
45b0: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
45c0: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
45d0: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
45e0: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
45f0: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
4600: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
4610: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
4620: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
4630: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
4640: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
4650: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
4660: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
4670: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
4680: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
4690: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
46a0: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
46b0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
46c0: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
46d0: 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70  liteAddColumnTyp
46e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
46f0: 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20   Token *pFirst, 
4700: 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20  Token *pLast){. 
4710: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
4720: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a   i, j;.  int n;.
4730: 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b    char *z, **pz;
4740: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4750: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
4760: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
4770: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
4780: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
4790: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
47a0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
47b0: 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70  ol[i];.  pz = &p
47c0: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20  Col->zType;.  n 
47d0: 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64  = pLast->n + Add
47e0: 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64  r(pLast->z) - Ad
47f0: 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20  dr(pFirst->z);. 
4800: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4810: 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c  g(pz, pFirst->z,
4820: 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70   n, 0);.  z = *p
4830: 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  z;.  if( z==0 ) 
4840: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
4850: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
4860: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69  .    int c = z[i
4870: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  ];.    if( isspa
4880: 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65  ce(c) ) continue
4890: 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63  ;.    z[j++] = c
48a0: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
48b0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
48c0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
48d0: 3d 34 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =4 ){.    pCol->
48e0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69  sortOrder = sqli
48f0: 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 7a 2c  teCollateType(z,
4900: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
4910: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
4920: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r = SQLITE_SO_NU
4930: 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  M;.  }.}../*.** 
4940: 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20  The given token 
4950: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
4960: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73  alue for the las
4970: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
4980: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63  o.** the table c
4990: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
49a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  onstruction.  If
49b0: 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20   "minusFlag" is 
49c0: 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  true, it.** mean
49d0: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65  s the value toke
49e0: 6e 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  n was preceded b
49f0: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
4a00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4a10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4a20: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
4a30: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
4a40: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
4a50: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4a60: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
4a70: 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56  qliteAddDefaultV
4a80: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
4a90: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c  se, Token *pVal,
4aa0: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
4ab0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
4ac0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70  nt i;.  char **p
4ad0: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
4ae0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
4af0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4b00: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
4b10: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
4b20: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
4b30: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69  ol[i].zDflt;.  i
4b40: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
4b50: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
4b60: 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c  ring(pz, "-", 1,
4b70: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
4b80: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
4b90: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
4ba0: 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a  ring(pz, pVal->z
4bb0: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
4bc0: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f   }.  sqliteDequo
4bd0: 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  te(*pz);.}../*.*
4be0: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
4bf0: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
4c00: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
4c10: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
4c20: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
4c30: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
4c40: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
4c50: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
4c60: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
4c70: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
4c80: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
4c90: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
4ca0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
4cb0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
4cc0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
4cd0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
4ce0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
4cf0: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
4d00: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
4d10: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
4d20: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
4d30: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
4d40: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
4d50: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
4d60: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
4d70: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
4d80: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
4d90: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
4da0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
4db0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69  umn as the row i
4dc0: 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a  d.  (Exception:.
4dd0: 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  ** For backwards
4de0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
4df0: 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61  ith older databa
4e00: 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  ses, do not do t
4e10: 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  his.** if the fi
4e20: 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f  le format versio
4e30: 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  n number is less
4e40: 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74   than 1.)  Set t
4e50: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
4e60: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
4e70: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4e80: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
4e90: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
4ea0: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
4eb0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
4ec0: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
4ed0: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
4ee0: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
4ef0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
4f00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
4f10: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
4f20: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
4f30: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
4f40: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
4f50: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
4f60: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
4f70: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
4f80: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
4f90: 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72   sqliteAddPrimar
4fa0: 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  yKey(Parse *pPar
4fb0: 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  se, IdList *pLis
4fc0: 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  t, int onError){
4fd0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
4fe0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4ff0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
5000: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
5010: 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  l = -1;.  if( pT
5020: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69  ab==0 ) goto pri
5030: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
5040: 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72   if( pTab->hasPr
5050: 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  imKey ){.    sql
5060: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
5070: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
5080: 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d  table \"", pTab-
5090: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
50a0: 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68   "\" has more th
50b0: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
50c0: 65 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ey", 0);.    pPa
50d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
50e0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
50f0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
5100: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
5110: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
5120: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
5130: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
5140: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
5150: 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20  st->nId==1 ){.  
5160: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
5170: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
5180: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
5190: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
51a0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pList->a[0].zNam
51b0: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
51c0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol].zName)==0 ) 
51d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
51e0: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
51f0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
5200: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
5210: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5220: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
5230: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
5240: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26  ile_format>=1 &&
5250: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 54 79   .           zTy
5260: 70 65 20 26 26 20 73 71 6c 69 74 65 53 74 72 49  pe && sqliteStrI
5270: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
5280: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
5290: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
52a0: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
52b0: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
52c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
52d0: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
52e0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c  pParse, 0, 0, pL
52f0: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
5300: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
5310: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
5320: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
5330: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
5340: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
5350: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  urn;.}../*.** Re
5360: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
5370: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 74  iate collating t
5380: 79 70 65 20 67 69 76 65 6e 20 61 20 74 79 70 65  ype given a type
5390: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   name..**.** The
53a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
53b0: 69 73 20 74 65 78 74 20 28 53 51 4c 49 54 45 5f  is text (SQLITE_
53c0: 53 4f 5f 54 45 58 54 29 20 69 66 20 74 68 65 20  SO_TEXT) if the 
53d0: 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6e  type.** name con
53e0: 74 61 69 6e 73 20 74 68 65 20 63 68 61 72 61 63  tains the charac
53f0: 74 65 72 20 73 74 72 65 61 6d 20 22 74 65 78 74  ter stream "text
5400: 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f 72 0a 2a  " or "blob" or.*
5410: 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e 79 20 6f  * "clob".  Any o
5420: 74 68 65 72 20 74 79 70 65 20 6e 61 6d 65 20 69  ther type name i
5430: 73 20 63 6f 6c 6c 61 74 65 64 20 61 73 20 6e 75  s collated as nu
5440: 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c 49 54 45  meric.** (SQLITE
5450: 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e 74  _SO_NUM)..*/.int
5460: 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79   sqliteCollateTy
5470: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
5480: 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29  Type, int nType)
5490: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
54a0: 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65 2d 31 3b  (i=0; i<nType-1;
54b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63   i++){.    switc
54c0: 68 28 20 7a 54 79 70 65 5b 69 5d 20 29 7b 0a 20  h( zType[i] ){. 
54d0: 20 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20       case 'b':. 
54e0: 20 20 20 20 20 63 61 73 65 20 27 42 27 3a 20 7b       case 'B': {
54f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
5500: 54 79 70 65 2d 33 20 26 26 20 73 71 6c 69 74 65  Type-3 && sqlite
5510: 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b  StrNICmp(&zType[
5520: 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30 20  i],"blob",4)==0 
5530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
5540: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  urn SQLITE_SO_TE
5550: 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  XT;.        }.  
5560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5570: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5580: 27 63 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'c':.      case 
5590: 27 43 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  'C': {.        i
55a0: 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26 26 20  f( i<nType-3 && 
55b0: 28 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28  (sqliteStrNICmp(
55c0: 26 7a 54 79 70 65 5b 69 5d 2c 22 63 68 61 72 22  &zType[i],"char"
55d0: 2c 34 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  ,4)==0 ||.      
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49       sqliteStrNI
5600: 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63  Cmp(&zType[i],"c
5610: 6c 6f 62 22 2c 34 29 3d 3d 30 29 0a 20 20 20 20  lob",4)==0).    
5620: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
5630: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5640: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20  O_TEXT;.        
5650: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
5660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
5670: 61 73 65 20 27 78 27 3a 0a 20 20 20 20 20 20 63  ase 'x':.      c
5680: 61 73 65 20 27 58 27 3a 20 7b 0a 20 20 20 20 20  ase 'X': {.     
5690: 20 20 20 69 66 28 20 69 3e 3d 32 20 26 26 20 73     if( i>=2 && s
56a0: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a  qliteStrNICmp(&z
56b0: 54 79 70 65 5b 69 2d 32 5d 2c 22 74 65 78 74 22  Type[i-2],"text"
56c0: 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,4)==0 ){.      
56d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
56e0: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20  E_SO_TEXT;.     
56f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
5700: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5710: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
5750: 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  _NUM;.}../*.** T
5760: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5770: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
5780: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
5790: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
57a0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
57b0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
57c0: 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61   A "COLLATE" cla
57d0: 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  use has.** been 
57e0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
57f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
5800: 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e  sets the Column.
5810: 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20  sortOrder on.** 
5820: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
5830: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
5840: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
5850: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61 74   sqliteAddCollat
5860: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
5870: 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79 70  rse, int collTyp
5880: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
5890: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
58a0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
58b0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
58c0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
58d0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
58e0: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72  ) p->aCol[i].sor
58f0: 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79 70  tOrder = collTyp
5900: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65  e;.}../*.** Come
5910: 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20 72   up with a new r
5920: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20  andom value for 
5930: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
5940: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a  e.  Make sure.**
5950: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
5960: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
5970: 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20   the old..**.** 
5980: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
5990: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
59a0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
59b0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
59c0: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
59d0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
59e0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
59f0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
5a00: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
5a10: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
5a20: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
5a30: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
5a40: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
5a50: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
5a60: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
5a70: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
5a80: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
5a90: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
5aa0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
5ab0: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
5ac0: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
5ad0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
5ae0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
5af0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
5b00: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
5b10: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
5b20: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
5b30: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
5b40: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
5b50: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
5b60: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
5b70: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
5b80: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
5b90: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
5ba0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
5bb0: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
5bc0: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
5bd0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
5be0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
5bf0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
5c00: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
5c10: 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61 6e 67  void sqliteChang
5c20: 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a  eCookie(sqlite *
5c30: 64 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20 20  db, Vdbe *v){.  
5c40: 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  if( db->next_coo
5c50: 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d 2e  kie==db->aDb[0].
5c60: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b  schema_cookie ){
5c70: 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  .    db->next_co
5c80: 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b 30  okie = db->aDb[0
5c90: 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ].schema_cookie 
5ca0: 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79  + sqliteRandomBy
5cb0: 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62  te() + 1;.    db
5cc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
5cd0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
5ce0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5cf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
5d00: 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  er, db->next_coo
5d10: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  kie, 0);.    sql
5d20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5d30: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
5d40: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
5d50: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
5d60: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
5d70: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
5d80: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
5d90: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
5da0: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
5db0: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
5dc0: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
5dd0: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
5de0: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
5df0: 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  inator..*/.stati
5e00: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
5e10: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
5e20: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  {.  int n;.  int
5e30: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a   needQuote = 0;.
5e40: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
5e50: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
5e60: 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b  ( *z=='\'' ){ n+
5e70: 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20  +; needQuote=1; 
5e80: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
5e90: 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a   + needQuote*2;.
5ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
5eb0: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74  n identifier ont
5ec0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
5ed0: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
5ee0: 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61  Add.** quote cha
5ef0: 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65  racters as neede
5f00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
5f10: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
5f20: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
5f30: 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20  har *zIdent){.  
5f40: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
5f50: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
5f60: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
5f70: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
5f80: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
5f90: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
5fa0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
5fb0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
5fc0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
5fd0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
5fe0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6000: 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64  sqliteKeywordCod
6010: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
6020: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
6030: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
6040: 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  '\'';.  for(j=0;
6050: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
6060: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
6070: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
6080: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27  ( zIdent[j]=='\'
6090: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  ' ) z[i++] = '\'
60a0: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
60b0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
60c0: 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d  = '\'';.  z[i] =
60d0: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
60e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
60f0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
6100: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
6110: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
6120: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
6130: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
6140: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
6150: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
6160: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
6170: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
6180: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
6190: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
61a0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
61b0: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
61c0: 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70  bleStmt(Table *p
61d0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
61e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
61f0: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
6200: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
6210: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  n = 0;.  for(i=0
6220: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
6230: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
6240: 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b  tLength(p->aCol[
6250: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
6260: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
6270: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
6280: 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a  f( n<40 ){.    z
6290: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
62a0: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
62b0: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
62c0: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
62d0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
62e0: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
62f0: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
6300: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
6310: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
6320: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
6330: 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  aw( n );.  if( z
6340: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
6350: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74   0;.  strcpy(zSt
6360: 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20  mt, p->iDb==1 ? 
6370: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
6380: 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54  LE " : "CREATE T
6390: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
63a0: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
63b0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
63c0: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
63d0: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
63e0: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ';.  for(i=0; i<
63f0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
6400: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
6410: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
6420: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
6430: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
6440: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
6450: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
6460: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
6470: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70  me);.  }.  strcp
6480: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
6490: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
64a0: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
64b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
64c0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
64d0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
64e0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
64f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6500: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
6510: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
6520: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
6530: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
6540: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
6550: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
6560: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
6570: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
6580: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
6590: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
65a0: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
65b0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
65c0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
65d0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
65e0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73 20  .** unless this 
65f0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
6600: 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61 67  able or initFlag
6610: 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46  ==1.  When initF
6620: 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65  lag==1,.** it me
6630: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
6640: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6650: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
6660: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
6670: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
6680: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
6690: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
66a0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
66b0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
66c0: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
66d0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
66e0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
66f0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
6700: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
6710: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
6720: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
6730: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
6740: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
6750: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
6760: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
6770: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
6780: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
6790: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
67a0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
67b0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
67c0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
67d0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
67e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
67f0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
6800: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
6810: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
6820: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
6830: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
6840: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6850: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
6860: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
6870: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
6880: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
6890: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
68a0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
68b0: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
68c0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
68d0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
68e0: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
68f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
6900: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
6910: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
6920: 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74  table is generat
6930: 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ed from a SELECT
6940: 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74  , then construct
6950: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f   the.  ** list o
6960: 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  f columns and th
6970: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61  e text of the ta
6980: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
6990: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54  pSelect ){.    T
69a0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20  able *pSelTab = 
69b0: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
69c0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
69d0: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
69e0: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
69f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
6a00: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
6a10: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20   );.    p->nCol 
6a20: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
6a30: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70  .    p->aCol = p
6a40: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
6a50: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
6a60: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
6a70: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
6a80: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
6a90: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
6aa0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6ab0: 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74  initFlag is 1 it
6ac0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
6ad0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
6ae0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
6af0: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
6b00: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
6b10: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
6b20: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
6b30: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
6b40: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
6b50: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
6b60: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
6b70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
6b80: 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e  rom the pParse->
6b90: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
6ba0: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
6bb0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
6bc0: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
6bd0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
6be0: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
6bf0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
6c00: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
6c10: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72    p->tnum = pPar
6c20: 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  se->newTnum;.  }
6c30: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
6c40: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
6c50: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
6c60: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
6c70: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
6c80: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
6c90: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
6ca0: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
6cb0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
6cc0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
6cd0: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
6ce0: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
6cf0: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
6d00: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
6d10: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
6d20: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
6d30: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
6d40: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
6d50: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
6d60: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
6d70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
6d80: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
6d90: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
6da0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20  Vdbe *v;..    v 
6db0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
6dc0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
6dd0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
6de0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
6df0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
6e00: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
6e10: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
6e20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6e30: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c  _CreateTable, 0,
6e40: 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20   p->iDb);.      
6e50: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6e60: 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P3(v, -1, (char 
6e70: 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  *)&p->tnum, P3_P
6e80: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c  OINTER);.    }el
6e90: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
6ea0: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  iew */.      sql
6eb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6ec0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
6ed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
6ee0: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73 71  tnum = 0;.    sq
6ef0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6f00: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
6f10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6f20: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6f30: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
6f40: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
6f50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
6f60: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6f70: 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f 53  1, "table", P3_S
6f80: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c 73  TATIC);.    }els
6f90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e{.      sqliteV
6fa0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6fb0: 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53 54  1, "view", P3_ST
6fc0: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
6fd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6fe0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
6ff0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7000: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7010: 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33  -1, p->zName, P3
7020: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
7030: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7040: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
7050: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
7060: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
7070: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54   p->zName, P3_ST
7080: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
7090: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
70a0: 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20 20  _Dup, 4, 0);.   
70b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
70c0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
70d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
70e0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
70f0: 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54  har *z = createT
7100: 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20  ableStmt(p);.   
7110: 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65     n = z ? strle
7120: 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  n(z) : 0;.      
7130: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
7140: 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  P3(v, -1, z, n);
7150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7160: 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(z);.    }else{
7170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7180: 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  End!=0 );.      
7190: 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a  n = Addr(pEnd->z
71a0: 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d  ) - Addr(pParse-
71b0: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29 20  >sFirstToken.z) 
71c0: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
71d0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
71e0: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46 69   -1, pParse->sFi
71f0: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
7200: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7220: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
7230: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
7240: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
7250: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
7260: 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20 29     if( !p->iDb )
7270: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
7280: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
7290: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
72a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
72b0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
72c0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
72d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
72e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
72f0: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c  Integer, p->iDb,
7300: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7310: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7320: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
7330: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
7340: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
7350: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
7360: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53  arse, pSelect, S
7370: 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20  RT_Table, 1, 0, 
7380: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
7390: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
73a0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
73b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
73c0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
73d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
73e0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
73f0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
7400: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
7410: 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72  plain==0 && pPar
7420: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
7430: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
7440: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
7450: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
7460: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
7470: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62  ->aDb[p->iDb].tb
7480: 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  lHash, .        
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74      p->zName, st
74b0: 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31  rlen(p->zName)+1
74c0: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
74d0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
74e0: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
74f0: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
7500: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
7510: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
7520: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
7530: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46      }.    for(pF
7540: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
7550: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
7560: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
7570: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
7580: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
7590: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
75a0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
75b0: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
75c0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b  >aDb[p->iDb].aFK
75d0: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
75e0: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nTo);.      sqli
75f0: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
7600: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
7610: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
7620: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
7630: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
7640: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
7650: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
7660: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
7670: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
7680: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hanges;.  }.}../
7690: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
76a0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
76b0: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
76c0: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
76d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
76e0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
76f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7700: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
7710: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
7720: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
7730: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
7740: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
7750: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
7760: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
7770: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
7780: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
7790: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
77a0: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
77b0: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
77c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
77d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
77e0: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
77f0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20  .  int isTemp   
7800: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
7810: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
7820: 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ew */.){.  Table
7830: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
7840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
7850: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 0a 20 20   Token sEnd;..  
7860: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
7870: 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c  (pParse, pBegin,
7880: 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c 20   pName, isTemp, 
7890: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
78a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
78b0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
78c0: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
78d0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
78e0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
78f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
7900: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
7910: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
7920: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
7930: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
7940: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
7950: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
7960: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
7970: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
7980: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
7990: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
79a0: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
79b0: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
79c0: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
79d0: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
79e0: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
79f0: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 5f 65  current sqlite_e
7a00: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
7a10: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
7a20: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65  elect = sqliteSe
7a30: 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29  lectDup(pSelect)
7a40: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
7a50: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
7a60: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7a70: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
7a80: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
7a90: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
7aa0: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
7ab0: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
7ac0: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
7ad0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
7ae0: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
7af0: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
7b00: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
7b10: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
7b20: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
7b30: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
7b40: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
7b50: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
7b60: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
7b70: 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64    n = ((int)sEnd
7b80: 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69  .z) - (int)pBegi
7b90: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67  n->z;.  z = pBeg
7ba0: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
7bb0: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
7bc0: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
7bd0: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
7be0: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
7bf0: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
7c00: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
7c10: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 74  liteEndTable() t
7c20: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
7c30: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
7c40: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
7c50: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50  qliteEndTable(pP
7c60: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
7c70: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
7c80: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
7c90: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
7ca0: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
7cb0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
7cc0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
7cd0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
7ce0: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
7cf0: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
7d00: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
7d10: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
7d20: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
7d30: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
7d40: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 65  message in pPare
7d50: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
7d60: 74 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43  t sqliteViewGetC
7d70: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
7d80: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
7d90: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72  *pTable){.  Expr
7da0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
7db0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
7dc0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
7dd0: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
7de0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
7df0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73  e );..  /* A pos
7e00: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
7e10: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
7e20: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
7e30: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
7e40: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
7e50: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
7e60: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
7e70: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
7e80: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
7e90: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
7ea0: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
7eb0: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
7ec0: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
7ed0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
7ee0: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
7ef0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
7f00: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
7f10: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
7f20: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
7f30: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
7f40: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
7f50: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
7f60: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
7f70: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
7f80: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
7f90: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
7fa0: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
7fb0: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
7fc0: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
7fd0: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
7fe0: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
7ff0: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
8000: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
8010: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
8020: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
8030: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
8040: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
8050: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
8060: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8070: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8080: 4d 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54  Msg, "view ", pT
8090: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
80a0: 20 20 20 20 20 20 22 20 69 73 20 63 69 72 63 75        " is circu
80b0: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
80c0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
80d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
80e0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
80f0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
8100: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
8110: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
8120: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
8130: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8140: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
8150: 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30  ); /* If nCol==0
8160: 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75  , then pTable mu
8170: 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a  st be a VIEW */.
8180: 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d    pSel = pTable-
8190: 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
81a0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
81b0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75  ll to sqliteResu
81c0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
81d0: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
81e0: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
81f0: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20  s in this list. 
8200: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65   But we will nee
8210: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
8220: 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20   list.  ** back 
8230: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
8240: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66  configuration af
8250: 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20  terwards, so we 
8260: 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20  save a copy of. 
8270: 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
8280: 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f   in pEList..  */
8290: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
82a0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c  ->pEList;.  pSel
82b0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
82c0: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c  eExprListDup(pEL
82d0: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ist);.  if( pSel
82e0: 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ->pEList==0 ){. 
82f0: 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20     pSel->pEList 
8300: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65  = pEList;.    re
8310: 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 1;  /* Mall
8320: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
8330: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
8340: 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20  = -1;.  pSelTab 
8350: 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65  = sqliteResultSe
8360: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
8370: 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66  , 0, pSel);.  if
8380: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
8390: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
83a0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
83b0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
83c0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
83d0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
83e0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
83f0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
8400: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  l = 0;.    pSelT
8410: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
8420: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
8430: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
8440: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
8450: 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62  >aDb[pTable->iDb
8460: 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ].flags |= SQLIT
8470: 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  E_UnresetViews;.
8480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
8490: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
84a0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
84b0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62   sqliteSelectUnb
84c0: 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c  ind(pSel);.  sql
84d0: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
84e0: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
84f0: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
8500: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75  = pEList;.  retu
8510: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
8520: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
8530: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
8540: 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e  the VIEW pTable.
8550: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8560: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
8570: 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72  enever any other
8580: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
8590: 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54  s modified..** T
85a0: 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69  he view passed i
85b0: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
85c0: 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69   might depend di
85d0: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
85e0: 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ctly.** on the m
85f0: 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74  odified or delet
8600: 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e  ed table so we n
8610: 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65  eed to clear the
8620: 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e   old column.** n
8630: 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ames so that the
8640: 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70  y will be recomp
8650: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
8660: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
8670: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
8680: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
8690: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
86a0: 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62  Table==0 || pTab
86b0: 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  le->pSelect==0 )
86c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
86d0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29  Table->nCol==0 )
86e0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
86f0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
8700: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
8710: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
8720: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
8730: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8740: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
8750: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
8760: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
8770: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20  Col[i].zType);. 
8780: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
8790: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
87a0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
87b0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
87c0: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
87d0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
87e0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
87f0: 79 20 56 49 45 57 2e 0a 2a 2f 0a 73 74 61 74 69  y VIEW..*/.stati
8800: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
8810: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
8820: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
8830: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
8840: 20 69 66 28 20 28 64 62 2d 3e 61 44 62 5b 69 64   if( (db->aDb[id
8850: 78 5d 2e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  x].flags & SQLIT
8860: 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3d  E_UnresetViews)=
8870: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
8880: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
8890: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
88a0: 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  x].tblHash); i; 
88b0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
88c0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
88d0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
88e0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
88f0: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
8900: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8910: 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  ViewResetColumnN
8920: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
8930: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  }.  }.  db->aDb[
8940: 69 64 78 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 53  idx].flags &= ~S
8950: 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65  QLITE_UnresetVie
8960: 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ws;.}../*.** Giv
8970: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b  en a token, look
8980: 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68   up a table with
8990: 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20   that name.  If 
89a0: 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65  not found, leave
89b0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  .** an error for
89c0: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66   the parser to f
89d0: 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ind and return N
89e0: 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ULL..*/.Table *s
89f0: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
8a00: 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ken(Parse *pPars
8a10: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b  e, Token *pTok){
8a20: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
8a30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
8a40: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
8a50: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
8a60: 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a  n(pTok);.  if( z
8a70: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
8a80: 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   0;.  pTab = sql
8a90: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
8aa0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
8ab0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  0);.  sqliteFree
8ac0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
8ad0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
8ae0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
8af0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8b00: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
8b10: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
8b20: 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e  pTok->z, pTok->n
8b30: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
8b40: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
8b50: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
8b60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8b70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
8b80: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
8b90: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
8ba0: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
8bb0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
8bc0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
8bd0: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
8be0: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
8bf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8c00: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  oken *pName, int
8c10: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
8c20: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62  e *pTable;.  Vdb
8c30: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
8c40: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
8c50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8c60: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
8c70: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
8c80: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
8c90: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
8ca0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54  pTable = sqliteT
8cb0: 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  ableFromToken(pP
8cc0: 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  arse, pName);.  
8cd0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
8ce0: 72 65 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20  return;.  iDb = 
8cf0: 70 54 61 62 6c 65 2d 3e 69 44 62 3b 0a 23 69 66  pTable->iDb;.#if
8d00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8d10: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
8d20: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
8d30: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
8d40: 49 54 45 5f 44 45 4c 45 54 45 2c 20 53 43 48 45  ITE_DELETE, SCHE
8d50: 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 6c 65 2d  MA_TABLE(pTable-
8d60: 3e 69 44 62 29 2c 30 29 29 7b 0a 20 20 20 20 72  >iDb),0)){.    r
8d70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7b 0a 20  eturn;.  }.  {. 
8d80: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
8d90: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
8da0: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
8db0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
8dc0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
8dd0: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
8de0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
8df0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
8e00: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
8e10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8e20: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
8e30: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
8e40: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
8e50: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
8e60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
8e70: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
8e80: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
8e90: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
8ea0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
8eb0: 2c 20 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d 3e  , code, pTable->
8ec0: 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
8ed0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8ee0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
8ef0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
8f00: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
8f10: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
8f20: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8f30: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
8f40: 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c 65  dif.  if( pTable
8f50: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
8f60: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
8f70: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8f80: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
8f90: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  able->zName, .  
8fa0: 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62       " may not b
8fb0: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
8fc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
8fd0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
8fe0: 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77    }.  if( isView
8ff0: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
9000: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
9010: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
9020: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
9030: 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
9040: 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
9050: 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  ",.      pTable-
9060: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9070: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9080: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9090: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
90a0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
90b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
90c0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
90d0: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44  >zErrMsg, "use D
90e0: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
90f0: 74 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20 20  te view ",.     
9100: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
9110: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
9120: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
9130: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rn;.  }..  /* Ge
9140: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
9150: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
9160: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
9170: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
9180: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
9190: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
91a0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
91b0: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
91c0: 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d  Op dropTable[] =
91d0: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
91e0: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
91f0: 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(8),  0},.     
9200: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
9210: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
9220: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
9230: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
9240: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
9250: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  },.      { OP_Me
9260: 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20  mLoad,    1, 0, 
9270: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
9280: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
9290: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20  lumn,     0, 2, 
92a0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
92b0: 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20   { OP_Ne,       
92c0: 20 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30    0, ADDR(7),  0
92d0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
92e0: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
92f0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
9300: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
9310: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
9320: 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d  }, /* 7 */.    }
9330: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
9340: 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  x;.    Trigger *
9350: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71  pTrigger;.    sq
9360: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
9370: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
9380: 30 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  0, pTable->iDb);
9390: 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d  .    sqliteOpenM
93a0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54  asterTable(v, pT
93b0: 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20  able->iDb);.    
93c0: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
93d0: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
93e0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
93f0: 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a  eing dropped */.
9400: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
9410: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b  Table->pTrigger;
9420: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
9430: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 53 72  gger ){.      Sr
9440: 63 4c 69 73 74 20 2a 70 4e 6d 3b 0a 20 20 20 20  cList *pNm;.    
9450: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
9460: 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  er->iDb==pTable-
9470: 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20 70 4e  >iDb );.      pN
9480: 6d 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73  m = sqliteSrcLis
9490: 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 30 29  tAppend(0, 0, 0)
94a0: 3b 0a 20 20 20 20 20 20 70 4e 6d 2d 3e 61 5b 30  ;.      pNm->a[0
94b0: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
94c0: 53 74 72 44 75 70 28 70 54 72 69 67 67 65 72 2d  StrDup(pTrigger-
94d0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e  >name);.      pN
94e0: 6d 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  m->a[0].zDatabas
94f0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
9500: 28 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d  (db->aDb[pTable-
9510: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >iDb].zName);.  
9520: 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72      sqliteDropTr
9530: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 4e  igger(pParse, pN
9540: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  m, 1);.      if(
9550: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
9560: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
9570: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
9580: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
9590: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72  lse{.        pTr
95a0: 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e  igger = pTable->
95b0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20  pTrigger;.      
95c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 73 65  }.    }.    base
95d0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
95e0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
95f0: 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20  ize(dropTable), 
9600: 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  dropTable);.    
9610: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
9620: 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54  P3(v, base+1, pT
9630: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
9640: 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 6c 65  .    if( !pTable
9650: 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ->iDb ){.      s
9660: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
9670: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
9680: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9690: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
96a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
96b0: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
96c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
96d0: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
96e0: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54  pTable->tnum, pT
96f0: 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20  able->iDb);.    
9700: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c    for(pIdx=pTabl
9710: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  e->pIndex; pIdx;
9720: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9730: 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t){.        sqli
9740: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9750: 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d  P_Destroy, pIdx-
9760: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
9770: 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
9780: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64   }.    sqliteEnd
9790: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
97a0: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
97b0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
97c0: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
97d0: 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  on of the table.
97e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
97f0: 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c  tion: if the SQL
9800: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e   statement began
9810: 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49   with the EXPLAI
9820: 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20  N keyword,.  ** 
9830: 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  then no changes 
9840: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a  should be made..
9850: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
9860: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
9870: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
9880: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
9890: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64  , pTable);.    d
98a0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
98b0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
98c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
98d0: 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
98e0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Db);.}../*.** Th
98f0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 74  is routine const
9900: 72 75 63 74 73 20 61 20 50 33 20 73 74 72 69 6e  ructs a P3 strin
9910: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 61  g suitable for a
9920: 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 0a  n OP_MakeIdxKey.
9930: 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 61 64  ** opcode and ad
9940: 64 73 20 74 68 61 74 20 50 33 20 73 74 72 69 6e  ds that P3 strin
9950: 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  g to the most re
9960: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
9970: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69  instruction.** i
9980: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
9990: 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33 20 73  chine.  The P3 s
99a0: 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f  tring consists o
99b0: 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61  f a single chara
99c0: 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61 63 68  cter.** for each
99d0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69   column in the i
99e0: 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74 61 62  ndex pIdx of tab
99f0: 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74 68 65  le pTab.  If the
9a00: 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a 20   column uses.** 
9a10: 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74 20 6f  a numeric sort o
9a20: 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 50  rder, then the P
9a30: 33 20 73 74 72 69 6e 67 20 63 68 61 72 61 63 74  3 string charact
9a40: 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  er corresponding
9a50: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f 6c 75   to.** that colu
9a60: 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66 20 74  mn is 'n'.  If t
9a70: 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 20 61  he column uses a
9a80: 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64 65 72   text sort order
9a90: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 50 33  , then the.** P3
9aa0: 20 73 74 72 69 6e 67 20 69 73 20 27 74 27 2e 20   string is 't'. 
9ab0: 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65   See the OP_Make
9ac0: 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20 64 6f  IdxKey opcode do
9ad0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a  cumentation for.
9ae0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ** additional in
9af0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65 20  formation.  See 
9b00: 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41  also the sqliteA
9b10: 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74  ddKeyType() rout
9b20: 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
9b30: 69 74 65 41 64 64 49 64 78 4b 65 79 54 79 70 65  iteAddIdxKeyType
9b40: 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65 78 20  (Vdbe *v, Index 
9b50: 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72 20 2a  *pIdx){.  char *
9b60: 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zType;.  Table *
9b70: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  pTab;.  int i, n
9b80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
9b90: 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 54 61  !=0 && pIdx->pTa
9ba0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54 61 62  ble!=0 );.  pTab
9bb0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
9bc0: 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  .  n = pIdx->nCo
9bd0: 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20 3d 20  lumn;.  zType = 
9be0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
9bf0: 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 54   n+1 );.  if( zT
9c00: 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ype==0 ) return;
9c10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
9c20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
9c30: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
9c40: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73  lumn[i];.    ass
9c50: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20  ert( iCol>=0 && 
9c60: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
9c70: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
9c80: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72  ->aCol[iCol].sor
9c90: 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f  tOrder & SQLITE_
9ca0: 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51  SO_TYPEMASK)==SQ
9cb0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
9cc0: 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d        zType[i] =
9cd0: 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   't';.    }else{
9ce0: 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  .      zType[i] 
9cf0: 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  = 'n';.    }.  }
9d00: 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b  .  zType[n] = 0;
9d10: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61  .  sqliteVdbeCha
9d20: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79  ngeP3(v, -1, zTy
9d30: 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pe, n);.  sqlite
9d40: 46 72 65 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a  Free(zType);.}..
9d50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9d60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
9d70: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
9d80: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
9d90: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
9da0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9db0: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
9dc0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
9dd0: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
9de0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
9df0: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
9e00: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
9e10: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
9e20: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
9e30: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
9e40: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
9e50: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
9e60: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
9e70: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
9e80: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
9e90: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
9ea0: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
9eb0: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
9ec0: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
9ed0: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
9ee0: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
9ef0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
9f00: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
9f10: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
9f20: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
9f30: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
9f40: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
9f50: 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
9f60: 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
9f70: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
9f80: 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
9f90: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
9fa0: 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
9fb0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
9fc0: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
9fd0: 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
9fe0: 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
9ff0: 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
a000: 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
a010: 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
a020: 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
a030: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 45 6e 64   until sqliteEnd
a040: 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Table()..**.** T
a050: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
a060: 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
a070: 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
a080: 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
a090: 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 44  ll.** to sqliteD
a0a0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
a0b0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
a0c0: 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
a0d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72  */.void sqliteCr
a0e0: 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
a0f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a100: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a110: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
a120: 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  dList *pFromCol,
a130: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
a140: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
a150: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
a160: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
a170: 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
a180: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
a190: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
a1a0: 20 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c   IdList *pToCol,
a1b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
a1c0: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
a1d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
a1e0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
a1f0: 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
a200: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
a210: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a220: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
a230: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
a240: 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
a250: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
a260: 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  *z;.  FKey *pFKe
a270: 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  y = 0;..  assert
a280: 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
a290: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
a2a0: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b  ->nErr ) goto fk
a2b0: 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
a2c0: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
a2d0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
a2e0: 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  l-1;.    if( iCo
a2f0: 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  l<0 ) goto fk_en
a300: 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
a310: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64  l && pToCol->nId
a320: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
a330: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
a340: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
a350: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
a360: 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ", -1,.         
a370: 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
a380: 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  ame, -1, .      
a390: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
a3a0: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
a3b0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 22  olumn of table "
a3c0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 70  , -1,.         p
a3d0: 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20 30  To->z, pTo->n, 0
a3e0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
a3f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67  >nErr++;.      g
a400: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
a410: 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
a420: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
a430: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49  ol && pToCol->nI
a440: 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64  d!=pFromCol->nId
a450: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
a460: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
a470: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
a480: 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
a490: 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
a4a0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
a4b0: 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
a4c0: 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
a4d0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
a4e0: 72 65 6e 63 65 64 20 74 61 62 6c 65 22 2c 20 30  renced table", 0
a4f0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
a500: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
a510: 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
a520: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
a530: 6d 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20  mCol->nId;.  }. 
a540: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
a550: 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73  *pFKey) + nCol*s
a560: 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
a570: 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
a580: 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
a590: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
a5a0: 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20   i<pToCol->nId; 
a5b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
a5c0: 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43  e += strlen(pToC
a5d0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
a5e0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
a5f0: 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d   pFKey = sqliteM
a600: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
a610: 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
a620: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
a630: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
a640: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
a650: 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
a660: 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
a670: 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
a680: 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
a690: 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
a6a0: 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
a6b0: 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
a6c0: 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
a6d0: 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
a6e0: 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
a6f0: 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
a700: 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
a710: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
a720: 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
a730: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
a740: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
a750: 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
a760: 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
a770: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
a780: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
a790: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
a7a0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a7b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
a7c0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
a7d0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
a7e0: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
a7f0: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
a800: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
a810: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
a820: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
a830: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
a840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a860: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
a870: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
a880: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
a890: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e  ->zErrMsg, "unkn
a8a0: 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20  own column \"", 
a8b0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
a8c0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
a8d0: 20 22 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20   "\" in foreign 
a8e0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
a8f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
a900: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
a910: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
a920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a930: 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
a940: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
a950: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
a960: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
a970: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
a980: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
a990: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
a9a0: 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
a9b0: 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
a9c0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
a9d0: 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
a9e0: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
a9f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
aa00: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
aa10: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65  0;.  pFKey->dele
aa20: 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26  teConf = flags &
aa30: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
aa40: 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c  updateConf = (fl
aa50: 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
aa60: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65  f;.  pFKey->inse
aa70: 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  rtConf = (flags 
aa80: 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a  >> 16 ) & 0xff;.
aa90: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
aaa0: 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
aab0: 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
aac0: 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
aad0: 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
aae0: 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
aaf0: 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
ab00: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
ab10: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
ab20: 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  te(pFromCol);.  
ab30: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
ab40: 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  te(pToCol);.}../
ab50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ab60: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
ab70: 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
ab80: 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
ab90: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
aba0: 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
abb0: 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
abc0: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
abd0: 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
abe0: 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
abf0: 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
ac00: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
ac10: 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
ac20: 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
ac30: 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
ac40: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
ac50: 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
ac60: 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
ac70: 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
ac80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ac90: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
aca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
acb0: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
acc0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
acd0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
ace0: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
acf0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
ad00: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
ad10: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
ad20: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
ad30: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
ad40: 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a  Deferred;.}../*.
ad50: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
ad60: 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
ad70: 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20   table.  pIndex 
ad80: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
ad90: 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
ada0: 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e   pTable is the n
adb0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
adc0: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
add0: 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
ade0: 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
adf0: 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
ae00: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
ae10: 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
ae20: 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
ae30: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
ae40: 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
ae50: 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
ae60: 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
ae70: 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
ae80: 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
ae90: 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
aea0: 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
aeb0: 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
aec0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
aed0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
aee0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
aef0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
af00: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
af10: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
af20: 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
af30: 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
af40: 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
af50: 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
af60: 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
af70: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
af80: 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
af90: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
afa0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
afb0: 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
afc0: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
afd0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
afe0: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c  pParse,   /* All
aff0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
b000: 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
b010: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
b020: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
b030: 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62  he index.  May b
b040: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
b050: 69 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f 2a 20  ist *pTable, /* 
b060: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
b070: 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65  e to index.  Use
b080: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b090: 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c  le if 0 */.  IdL
b0a0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
b0b0: 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
b0c0: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
b0d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
b0e0: 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f  r,     /* OE_Abo
b0f0: 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
b100: 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
b110: 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69  _None */.  int i
b120: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
b130: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
b140: 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78   temporary index
b150: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
b160: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
b170: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
b180: 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
b190: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
b1a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
b1b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
b1c0: 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
b1d0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
b1e0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
b1f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
b200: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
b210: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
b220: 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a  ex *pIndex;   /*
b230: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
b240: 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
b250: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
b260: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
b270: 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20  en nullId;      
b280: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
b290: 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
b2a0: 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73  y ID list */.  s
b2b0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
b2c0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
b2d0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
b2e0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
b2f0: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
b300: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
b310: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
b320: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
b330: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
b340: 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
b350: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
b360: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
b370: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b380: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Name!=0 );.    a
b390: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
b3a0: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Src==1 );.    pT
b3b0: 61 62 20 3d 20 20 73 71 6c 69 74 65 53 72 63 4c  ab =  sqliteSrcL
b3c0: 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
b3d0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  , pTable);.  }el
b3e0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
b3f0: 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
b400: 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e  pTab =  pParse->
b410: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  pNewTable;.  }. 
b420: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
b430: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
b440: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
b450: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
b460: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
b470: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
b480: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
b490: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
b4a0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
b4b0: 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 69    " may not be i
b4c0: 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20 20 20  ndexed", 0);.   
b4d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
b4e0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
b4f0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
b500: 0a 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 26  .  if( !isTemp &
b510: 26 20 70 54 61 62 2d 3e 69 44 62 3e 3d 32 20 26  & pTab->iDb>=2 &
b520: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
b530: 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ag==0 ){.    sql
b540: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
b550: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
b560: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
b570: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d  Name, .      " m
b580: 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 6f 6e 2d  ay not have non-
b590: 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 69 63 65  temporary indice
b5a0: 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20  s added", 0);.  
b5b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
b5c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
b5d0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
b5e0: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  }.  if( pTab->pS
b5f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
b600: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
b610: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
b620: 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
b630: 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20   indexed", 0);. 
b640: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
b650: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
b660: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
b670: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69   }.  if( pTab->i
b680: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 69 73 54  Db==1 ){.    isT
b690: 65 6d 70 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  emp = 1;.  }..  
b6a0: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
b6b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
b6c0: 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
b6d0: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
b6e0: 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
b6f0: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
b700: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
b710: 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
b720: 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
b730: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
b740: 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
b750: 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
b760: 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
b770: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
b780: 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
b790: 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
b7a0: 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
b7b0: 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
b7c0: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
b7d0: 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
b7e0: 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
b7f0: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
b800: 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
b810: 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
b820: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
b830: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
b840: 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
b850: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
b860: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
b870: 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
b880: 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
b890: 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
b8a0: 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
b8b0: 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
b8c0: 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 26  */.  if( pName &
b8d0: 26 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  & !pParse->initF
b8e0: 6c 61 67 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  lag ){.    Index
b8f0: 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pISameName;   
b900: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65   /* Another inde
b910: 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  x with the same 
b920: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c  name */.    Tabl
b930: 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20  e *pTSameName;  
b940: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74    /* A table wit
b950: 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  h same name as t
b960: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
b970: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
b980: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
b990: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
b9a0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
b9b0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
b9c0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28 70  ndex;.    if( (p
b9d0: 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  ISameName = sqli
b9e0: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
b9f0: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b  zName, 0))!=0 ){
ba00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
ba10: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
ba20: 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  zErrMsg, "index 
ba30: 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  ", zName, .     
ba40: 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78      " already ex
ba50: 69 73 74 73 22 2c 20 30 29 3b 0a 20 20 20 20 20  ists", 0);.     
ba60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
ba70: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
ba80: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
ba90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54     }.    if( (pT
baa0: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
bab0: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
bac0: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
bad0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
bae0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
baf0: 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69  ErrMsg, "there i
bb00: 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
bb10: 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20  e named ",.     
bb20: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
bb30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
bb40: 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r++;.      goto 
bb50: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
bb60: 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
bb70: 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b   if( pName==0 ){
bb80: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
bb90: 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
bba0: 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
bbb0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
bbc0: 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
bbd0: 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
bbe0: 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
bbf0: 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
bc00: 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20  zBuf,"%d)",n);. 
bc10: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
bc20: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
bc30: 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70  g(&zName, "(", p
bc40: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75  Tab->zName, " au
bc50: 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c  toindex ", zBuf,
bc60: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   0);.    if( zNa
bc70: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
bc80: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bc90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
bca0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
bcb0: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
bcc0: 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f  me->n);.  }..  /
bcd0: 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
bce0: 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
bcf0: 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
bd00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
bd10: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
bd20: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69  TION.  assert( i
bd30: 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65  sTemp==0 || isTe
bd40: 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  mp==1 );.  asser
bd50: 74 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 70 50  t( pTab->iDb==pP
bd60: 61 72 73 65 2d 3e 69 44 62 20 7c 7c 20 69 73 54  arse->iDb || isT
bd70: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  emp==1 );.  if( 
bd80: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
bd90: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
bda0: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
bdb0: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 29 20  BLE(isTemp), 0) 
bdc0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
bdd0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
bde0: 20 7d 0a 20 20 69 20 3d 20 53 51 4c 49 54 45 5f   }.  i = SQLITE_
bdf0: 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
be00: 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d  if( isTemp ) i =
be10: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
be20: 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 69 66 28  EMP_INDEX;.  if(
be30: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
be40: 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
be50: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20  e, pTab->zName) 
be60: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
be70: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
be80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
be90: 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
bea0: 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
beb0: 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
bec0: 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
bed0: 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
bee0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
bef0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
bf00: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
bf10: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
bf20: 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
bf30: 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
bf40: 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
bf50: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
bf60: 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e  ullId.z = pTab->
bf70: 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
bf80: 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
bf90: 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  llId.n = strlen(
bfa0: 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
bfb0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64 4c  List = sqliteIdL
bfc0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e 75  istAppend(0, &nu
bfd0: 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
bfe0: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
bff0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c000: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
c010: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
c020: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
c030: 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
c040: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
c050: 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
c060: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
c070: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
c080: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
c090: 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49  f(int)*pList->nI
c0a0: 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  d );.  if( pInde
c0b0: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  x==0 ) goto exit
c0c0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
c0d0: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
c0e0: 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
c0f0: 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  x[1];.  pIndex->
c100: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
c110: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
c120: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20  [pList->nId];.  
c130: 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  strcpy(pIndex->z
c140: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
c150: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
c160: 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
c170: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
c180: 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d  ->nId;.  pIndex-
c190: 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
c1a0: 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f 6e  x->isUnique = on
c1b0: 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
c1c0: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
c1d0: 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
c1e0: 3e 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20  >iDb = isTemp ? 
c1f0: 31 20 3a 20 70 50 61 72 73 65 2d 3e 69 44 62 3b  1 : pParse->iDb;
c200: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
c210: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
c220: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
c230: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
c240: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
c250: 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
c260: 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
c270: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
c280: 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
c290: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
c2a0: 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
c2b0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
c2c0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
c2d0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
c2e0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
c2f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
c300: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
c310: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
c320: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
c330: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
c340: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
c350: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
c360: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
c370: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
c380: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
c390: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
c3a0: 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63 6f       " has no co
c3b0: 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c  lumn named ", pL
c3c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
c3d0: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
c3e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
c3f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64   sqliteFree(pInd
c400: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
c410: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c420: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
c430: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
c440: 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = j;.  }..  /* 
c450: 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
c460: 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
c470: 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
c480: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
c490: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
c4a0: 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
c4b0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
c4c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
c4d0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
c4e0: 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49   p = sqliteHashI
c4f0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
c500: 73 54 65 6d 70 5d 2e 69 64 78 48 61 73 68 2c 20  sTemp].idxHash, 
c510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c520: 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
c530: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
c540: 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
c550: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
c560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
c570: 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
c580: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
c590: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
c5a0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
c5b0: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
c5c0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
c5e0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c5f0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
c600: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
c610: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
c620: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
c630: 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
c640: 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
c650: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
c660: 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
c670: 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
c680: 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
c690: 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
c6a0: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
c6b0: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
c6c0: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
c6d0: 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
c6e0: 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
c6f0: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
c700: 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
c710: 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  dex==0.       ||
c720: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
c730: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
c740: 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ce){.    pIndex-
c750: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
c760: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
c770: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
c780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
c790: 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
c7a0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
c7b0: 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
c7c0: 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
c7d0: 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
c7e0: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
c7f0: 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
c800: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
c810: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70   }.    pIndex->p
c820: 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
c830: 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72  Next;.    pOther
c840: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
c850: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c860: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
c870: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
c880: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
c890: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
c8a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
c8b0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
c8c0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
c8d0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
c8e0: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
c8f0: 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
c900: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ber from the pPa
c910: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65  rse->newTnum fie
c920: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ld..  */.  if( p
c930: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
c940: 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  && pTable!=0 ){.
c950: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
c960: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
c970: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
c980: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
c990: 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
c9a0: 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
c9b0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
c9c0: 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
c9d0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
c9e0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
c9f0: 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
ca00: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
ca10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
ca20: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
ca30: 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46  *.  ** The initF
ca40: 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68  lag is 0 when th
ca50: 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
ca60: 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
ca70: 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
ca80: 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  .  The initFlag 
ca90: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
caa0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
cab0: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
cac0: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
cad0: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
cae0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
caf0: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
cb00: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
cb10: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
cb20: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
cb30: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
cb40: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
cb50: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
cb60: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
cb70: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
cb80: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
cb90: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
cba0: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
cbb0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
cbc0: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
cbd0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
cbe0: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
cbf0: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
cc00: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
cc10: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
cc20: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
cc30: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
cc40: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
cc50: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
cc60: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e  e if( pParse->in
cc70: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
cc80: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
cc90: 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
cca0: 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74  1, lbl2;.    int
ccb0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   i;.    int addr
ccc0: 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
ccd0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
cce0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ccf0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
cd00: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
cd10: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
cd20: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
cd30: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
cd40: 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29  arse, 0, isTemp)
cd50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70  ;.      sqliteOp
cd60: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
cd70: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a   isTemp);.    }.
cd80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cd90: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
cda0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  no, 0, 0);.    s
cdb0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cdc0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
cdd0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
cde0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
cdf0: 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54  , "index", P3_ST
ce00: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
ce10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ce20: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
ce30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
ce40: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49  angeP3(v, -1, pI
ce50: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  ndex->zName, P3_
ce60: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
ce70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ce80: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
ce90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
cea0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
ceb0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pTab->zName, P3_
cec0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64 64  STATIC);.    add
ced0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
cee0: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
cef0: 49 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70  Index, 0, isTemp
cf00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
cf10: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
cf20: 72 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65  r, (char*)&pInde
cf30: 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e  x->tnum, P3_POIN
cf40: 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  TER);.    pIndex
cf50: 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  ->tnum = 0;.    
cf60: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
cf70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cf80: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
cf90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
cfa0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
cfb0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65 6d  P_Integer, isTem
cfc0: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
cfd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
cfe0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
cff0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   0);.    }.    a
d000: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
d010: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
d020: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
d030: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
d040: 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41  d ){.      n = A
d050: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
d060: 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b  ddr(pStart->z) +
d070: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
d080: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
d090: 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c  addr, pStart->z,
d0a0: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   n);.    }.    s
d0b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d0c0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
d0d0: 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   5, 0);.    sqli
d0e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d0f0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
d100: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  0);.    if( pTab
d110: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
d120: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d130: 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
d140: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
d150: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d160: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
d170: 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  2, pTab->tnum);.
d180: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d190: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
d1a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pTab->zName, P3_
d1b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c  STATIC);.      l
d1c0: 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl2 = sqliteVdbe
d1d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d1e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d1f0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
d200: 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  , 2, lbl2);.    
d210: 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56    lbl1 = sqliteV
d220: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
d230: 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20  ecno, 2, 0);.   
d240: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
d250: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
d260: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
d270: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d280: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49  OP_Column, 2, pI
d290: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
d2a0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
d2b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d2c0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  p(v, OP_MakeIdxK
d2d0: 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ey, pIndex->nCol
d2e0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
d2f0: 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  f( db->file_form
d300: 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64  at>=4 ) sqliteAd
d310: 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70  dIdxKeyType(v, p
d320: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Index);.      sq
d330: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d340: 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70   OP_IdxPut, 1, p
d350: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
d360: 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20  OE_None);.      
d370: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
d380: 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78  P3(v, -1, "index
d390: 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
d3a0: 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
d3b0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
d3c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d3d0: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
d3e0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
d3f0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d400: 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20  (v, lbl2);.     
d410: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d420: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
d430: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d440: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d450: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
d460: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
d470: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble!=0 ){.      
d480: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
d490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61         sqliteCha
d4a0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
d4b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d4c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d4d0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
d4e0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d4f0: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
d500: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  n(pParse);.    }
d510: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
d520: 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
d530: 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
d540: 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  e_index:.  sqlit
d550: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
d560: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72  ist);.  sqliteSr
d570: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62  cListDelete(pTab
d580: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  le);.  sqliteFre
d590: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
d5a0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
d5b0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
d5c0: 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
d5d0: 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
d5e0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
d5f0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
d600: 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
d610: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d620: 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  eDropIndex(Parse
d630: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
d640: 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  t *pName){.  Ind
d650: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
d660: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20  be *v;.  sqlite 
d670: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d680: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
d690: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
d6a0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
d6b0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
d6c0: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
d6d0: 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   );.  pIndex = s
d6e0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
d6f0: 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
d700: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
d710: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
d720: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
d730: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
d740: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
d750: 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
d760: 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
d770: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
d780: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
d790: 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
d7a0: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  x ){.    sqliteE
d7b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d7c0: 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
d7d0: 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
d7e0: 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
d7f0: 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
d800: 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
d810: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
d820: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
d830: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
d840: 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20  dex->iDb>1 ){.  
d850: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
d860: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
d870: 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66   alter schema of
d880: 20 61 74 74 61 63 68 65 64 20 22 0a 20 20 20 20   attached ".    
d890: 20 20 20 22 64 61 74 61 62 61 73 65 73 22 2c 20     "databases", 
d8a0: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
d8b0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
d8c0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
d8d0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
d8e0: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
d8f0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
d900: 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
d910: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
d920: 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
d930: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
d940: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
d950: 54 45 5f 44 45 4c 45 54 45 2c 20 53 43 48 45 4d  TE_DELETE, SCHEM
d960: 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e  A_TABLE(pIndex->
d970: 69 44 62 29 2c 20 30 29 20 29 7b 0a 20 20 20 20  iDb), 0) ){.    
d980: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
d990: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
d9a0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
d9b0: 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
d9c0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
d9d0: 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
d9e0: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
d9f0: 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
da00: 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
da10: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
da20: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
da30: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
da40: 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
da50: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
da60: 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
da70: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
da80: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
da90: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
daa0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
dab0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
dac0: 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20  eOp dropIndex[] 
dad0: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
dae0: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
daf0: 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20  DR(9), 0}, .    
db00: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
db10: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
db20: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
db30: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
db40: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    1, 1,       0}
db50: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
db60: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
db70: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
db80: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
db90: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
dba0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
dbb0: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
dbc0: 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20  , ADDR(8), 0},. 
dbd0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
dbe0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
dbf0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
dc00: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
dc10: 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
dc20: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
dc30: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
dc40: 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
dc50: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
dc60: 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69  ..    sqliteBegi
dc70: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
dc80: 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65  pParse, 0, pInde
dc90: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
dca0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
dcb0: 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44  le(v, pIndex->iD
dcc0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
dcd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
dce0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
dcf0: 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70  dropIndex), drop
dd00: 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
dd10: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
dd20: 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78  , base+1, pIndex
dd30: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
dd40: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62   if( pIndex->iDb
dd50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
dd60: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
dd70: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
dd80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
dd90: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
dda0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
ddb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ddc0: 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d  Destroy, pIndex-
ddd0: 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69  >tnum, pIndex->i
dde0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  Db);.    sqliteE
ddf0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
de00: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
de10: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69   /* Delete the i
de20: 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70  n-memory descrip
de30: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64  tion of this ind
de40: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ex..  */.  if( !
de50: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
de60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  ){.    sqliteUnl
de70: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
de80: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
de90: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
dea0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
deb0: 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  nges;.  }..exit_
dec0: 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
ded0: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
dee0: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
def0: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
df00: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
df10: 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
df20: 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
df30: 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
df40: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
df50: 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
df60: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
df70: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
df80: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c  dList *sqliteIdL
df90: 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
dfa0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
dfb0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
dfc0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
dfd0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
dfe0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
dff0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
e000: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
e010: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
e020: 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d  List->nId & 7)==
e030: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
e040: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  IdList_item *a;.
e050: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65      a = sqliteRe
e060: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
e070: 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73  (pList->nId+8)*s
e080: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
e090: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  ]) );.    if( a=
e0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
e0b0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
e0c0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
e0d0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
e0e0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
e0f0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
e100: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
e110: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
e120: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
e130: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
e140: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
e150: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
e160: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  ].zName;.    sql
e170: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
e180: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
e190: 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ken->n, 0);.    
e1a0: 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
e1b0: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
e1c0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
e1d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
e1e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e1f0: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
e200: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
e210: 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
e220: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
e230: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
e240: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
e250: 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
e260: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
e270: 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
e280: 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
e290: 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
e2a0: 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
e2b0: 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
e2c0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
e2d0: 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
e2e0: 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
e2f0: 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
e300: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
e310: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
e320: 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
e330: 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
e340: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
e350: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
e360: 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
e370: 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
e380: 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
e390: 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
e3a0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
e3b0: 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
e3c0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
e3d0: 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
e3e0: 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
e3f0: 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
e400: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
e410: 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
e420: 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
e430: 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
e440: 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
e450: 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
e460: 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
e470: 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
e480: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
e490: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
e4a0: 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
e4b0: 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
e4c0: 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
e4d0: 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
e4e0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
e4f0: 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
e500: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
e510: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70  sqliteSrcListApp
e520: 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  end(A,B,0);.**.*
e530: 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
e540: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
e550: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
e560: 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
e570: 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
e580: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
e590: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
e5a0: 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
e5b0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
e5c0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
e5d0: 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
e5e0: 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
e5f0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53  SrcList *sqliteS
e600: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
e610: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
e620: 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
e630: 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
e640: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
e650: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
e660: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
e670: 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
e680: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
e6a0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72   if( (pList->nSr
e6b0: 63 20 26 20 37 29 3d 3d 31 20 29 7b 0a 20 20 20  c & 7)==1 ){.   
e6c0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
e6d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
e6e0: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a  eRealloc(pList,.
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
e700: 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
e710: 28 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 38 29 2a  (pList->nSrc+8)*
e720: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
e730: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
e740: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
e750: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
e760: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
e770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
e780: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
e790: 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ew;.  }.  memset
e7a0: 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
e7b0: 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65  ->nSrc], 0, size
e7c0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
e7d0: 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
e7e0: 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
e7f0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
e800: 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
e810: 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
e820: 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  & pTable ){.    
e830: 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70  Token *pTemp = p
e840: 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44  Database;.    pD
e850: 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65  atabase = pTable
e860: 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70  ;.    pTable = p
e870: 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Temp;.  }.  if( 
e880: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 68  pTable ){.    ch
e890: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
e8a0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
e8b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69  .zName;.    sqli
e8c0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
e8d0: 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70 54 61 62   pTable->z, pTab
e8e0: 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  le->n, 0);.    i
e8f0: 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
e900: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
e910: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
e920: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
e930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e940: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
e950: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
e960: 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b  if( pDatabase ){
e970: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
e980: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
e990: 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61 73  ->nSrc].zDatabas
e9a0: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
e9b0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 44 61 74  NString(pz, pDat
e9c0: 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61 62  abase->z, pDatab
e9d0: 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ase->n, 0);.    
e9e0: 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
e9f0: 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73      sqliteSrcLis
ea00: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
ea10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
ea20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea30: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
ea40: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
ea50: 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a   pList->nSrc++;.
ea60: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
ea70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
ea80: 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73  alias to the las
ea90: 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20  t identifier on 
eaa0: 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69  the given identi
eab0: 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  fier list..*/.vo
eac0: 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74  id sqliteSrcList
ead0: 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74  AddAlias(SrcList
eae0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
eaf0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
eb00: 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e  List && pList->n
eb10: 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Src>0 ){.    int
eb20: 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63   i = pList->nSrc
eb30: 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   - 1;.    sqlite
eb40: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
eb50: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20  t->a[i].zAlias, 
eb60: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
eb70: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  n->n, 0);.    sq
eb80: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73  liteDequote(pLis
eb90: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
eba0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
ebb0: 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
ebc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64  */.void sqliteId
ebd0: 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73  ListDelete(IdLis
ebe0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
ebf0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
ec00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
ec10: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
ec20: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
ec30: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
ec40: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
ec50: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
ec60: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
ec70: 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
ec80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ec90: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
eca0: 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
ecb0: 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
ecc0: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
ecd0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
ece0: 6e 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49  nt sqliteIdListI
ecf0: 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
ed00: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
ed10: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
ed20: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
ed30: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
ed40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
ed50: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
ed60: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ed70: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
ed80: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
ed90: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
eda0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
edb0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
edc0: 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
edd0: 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
ede0: 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
edf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c  .void sqliteSrcL
ee00: 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73  istDelete(SrcLis
ee10: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
ee20: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
ee30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
ee40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
ee50: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
ee60: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
ee70: 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73  t->a[i].zDatabas
ee80: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
ee90: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
eea0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
eeb0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
eec0: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ].zAlias);.    i
eed0: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  f( pList->a[i].p
eee0: 54 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  Tab && pList->a[
eef0: 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  i].pTab->isTrans
ef00: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
ef10: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
ef20: 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  0, pList->a[i].p
ef30: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
ef40: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
ef50: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
ef60: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
ef70: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c  iteExprDelete(pL
ef80: 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a  ist->a[i].pOn);.
ef90: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
efa0: 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
efb0: 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  i].pUsing);.  }.
efc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
efd0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
efe0: 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69  e COPY command i
eff0: 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c  s for compatibil
f000: 69 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65  ity with Postgre
f010: 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63  SQL and specific
f020: 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65  ially.** for the
f030: 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64   ability to read
f040: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70   the output of p
f050: 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72  g_dump.  The for
f060: 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c  mat is as.** fol
f070: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  lows:.**.**    C
f080: 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66  OPY table FROM f
f090: 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d  ile [USING DELIM
f0a0: 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a  ITERS string].**
f0b0: 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61  .** "table" is a
f0c0: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
f0d0: 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20   name.  We will 
f0e0: 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f  read lines of co
f0f0: 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20  de from.** file 
f100: 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62  to fill this tab
f110: 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46  le with data.  F
f120: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74  ile might be "st
f130: 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f  din".  The optio
f140: 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72  nal.** delimiter
f150: 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69   string identifi
f160: 65 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70  es the field sep
f170: 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65  arators.  The de
f180: 66 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a  fault is a tab..
f190: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
f1a0: 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  py(.  Parse *pPa
f1b0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
f1c0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
f1d0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
f1e0: 54 61 62 6c 65 4e 61 6d 65 2c 20 2f 2a 20 54 68  TableName, /* Th
f1f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
f200: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
f210: 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f  e will insert */
f220: 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e  .  Token *pFilen
f230: 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66  ame,    /* The f
f240: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
f250: 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  o obtain informa
f260: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
f270: 2a 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f  *pDelimiter,   /
f280: 2a 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68  * Use this as th
f290: 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65  e field delimite
f2a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  r */.  int onErr
f2b0: 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  or          /* W
f2c0: 68 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63  hat to do if a c
f2d0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20  onstraint fails 
f2e0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
f2f0: 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Tab;.  int i;.  
f300: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61  Vdbe *v;.  int a
f310: 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65  ddr, end;.  Inde
f320: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
f330: 2a 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71  *zFile = 0;.  sq
f340: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
f350: 65 2d 3e 64 62 3b 0a 0a 0a 20 20 69 66 28 20 73  e->db;...  if( s
f360: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
f370: 6c 65 64 20 20 29 20 67 6f 74 6f 20 63 6f 70 79  led  ) goto copy
f380: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73 65  _cleanup;.  asse
f390: 72 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e  rt( pTableName->
f3a0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61  nSrc==1 );.  pTa
f3b0: 62 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73  b = sqliteSrcLis
f3c0: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
f3d0: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69  pTableName);.  i
f3e0: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 73 71  f( pTab==0 || sq
f3f0: 6c 69 74 65 49 73 52 65 61 64 4f 6e 6c 79 28 70  liteIsReadOnly(p
f400: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 67  Parse, pTab) ) g
f410: 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70  oto copy_cleanup
f420: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69  ;.  zFile = sqli
f430: 74 65 53 74 72 4e 44 75 70 28 70 46 69 6c 65 6e  teStrNDup(pFilen
f440: 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d  ame->z, pFilenam
f450: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
f460: 65 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20  equote(zFile);. 
f470: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
f480: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f490: 49 54 45 5f 49 4e 53 45 52 54 2c 20 70 54 61 62  ITE_INSERT, pTab
f4a0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 29 0a  ->zName, zFile).
f4b0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 41        || sqliteA
f4c0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f4d0: 20 53 51 4c 49 54 45 5f 43 4f 50 59 2c 20 70 54   SQLITE_COPY, pT
f4e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65  ab->zName, zFile
f4f0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f  ) ){.    goto co
f500: 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  py_cleanup;.  }.
f510: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
f520: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
f530: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
f540: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
f550: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
f560: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 29 3b 0a   pTab->iDb==1);.
f570: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f580: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f590: 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 29  _FileOpen, 0, 0)
f5a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
f5b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
f5c0: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20  , pFilename->z, 
f5d0: 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20  pFilename->n);. 
f5e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
f5f0: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
f600: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f610: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
f620: 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  er, pTab->iDb, 0
f630: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
f640: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
f650: 6e 57 72 69 74 65 2c 20 30 2c 20 70 54 61 62 2d  nWrite, 0, pTab-
f660: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69  >tnum);.    sqli
f670: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
f680: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
f690: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
f6a0: 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78     for(i=1, pIdx
f6b0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
f6c0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f6d0: 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20  pNext, i++){.   
f6e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
f6f0: 3e 69 44 62 3d 3d 31 20 7c 7c 20 70 49 64 78 2d  >iDb==1 || pIdx-
f700: 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20  >iDb==pTab->iDb 
f710: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
f720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
f730: 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44  nteger, pIdx->iD
f740: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
f750: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f760: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 2c  OP_OpenWrite, i,
f770: 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pIdx->tnum);.  
f780: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
f790: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49  angeP3(v, -1, pI
f7a0: 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  dx->zName, P3_ST
f7b0: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
f7c0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
f7d0: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
f7e0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
f7f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f800: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
f810: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
f820: 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f  the row count */
f830: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d  .    }.    end =
f840: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
f850: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64  abel(v);.    add
f860: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
f870: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65  dOp(v, OP_FileRe
f880: 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  ad, pTab->nCol, 
f890: 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44  end);.    if( pD
f8a0: 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20 20  elimiter ){.    
f8b0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
f8c0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 44  geP3(v, addr, pD
f8d0: 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44 65  elimiter->z, pDe
f8e0: 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20 20  limiter->n);.   
f8f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
f900: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
f910: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f920: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
f930: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22 5c  geP3(v, addr, "\
f940: 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  t", 1);.    }.  
f950: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
f960: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y>=0 ){.      sq
f970: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f980: 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20   OP_FileColumn, 
f990: 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30 29 3b  pTab->iPKey, 0);
f9a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f9b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
f9c0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
f9d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f9e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f9f0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
fa00: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
fa10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
fa20: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
fa30: 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d      if( i==pTab-
fa40: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
fa50: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
fa60: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
fa70: 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20 77 69  umn is filled wi
fa80: 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20 69 74  th NULL since it
fa90: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c  s.        ** val
faa0: 75 65 20 69 73 20 61 6c 77 61 79 73 20 70 75 6c  ue is always pul
fab0: 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 63  led from the rec
fac0: 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ord number */.  
fad0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
fae0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
faf0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
fb00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fb10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fb20: 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e  v, OP_FileColumn
fb30: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , i, 0);.      }
fb40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fb50: 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  eGenerateConstra
fb60: 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73 65  intChecks(pParse
fb70: 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  , pTab, 0, 0, 0,
fb80: 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64   0, onError, add
fb90: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f  r);.    sqliteCo
fba0: 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28  mpleteInsertion(
fbb0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
fbc0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
fbd0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
fbe0: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
fbf0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
fc00: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fc10: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30   OP_AddImm, 1, 0
fc20: 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  );  /* Increment
fc30: 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20   row count */.  
fc40: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
fc50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
fc60: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
fc70: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
fc80: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29  lveLabel(v, end)
fc90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
fca0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
fcb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
fcc0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
fcd0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
fce0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
fcf0: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
fd00: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
fd10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fd20: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c  P_ColumnName, 0,
fd30: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
fd40: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
fd50: 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65 72   -1, "rows inser
fd60: 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ted", P3_STATIC)
fd70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
fd80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
fd90: 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20  llback, 1, 0);. 
fda0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f 70 79     }.  }.  .copy
fdb0: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
fdc0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
fdd0: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73  pTableName);.  s
fde0: 71 6c 69 74 65 46 72 65 65 28 7a 46 69 6c 65 29  qliteFree(zFile)
fdf0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
fe00: 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
fe10: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
fe20: 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e   sqliteBeginTran
fe30: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
fe40: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
fe50: 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  or){.  sqlite *d
fe60: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
fe70: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
fe80: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
fe90: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
fea0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
feb0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
fec0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
fed0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
fee0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
fef0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
ff00: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
ff10: 22 42 45 47 49 4e 22 2c 20 30 29 20 29 20 72 65  "BEGIN", 0) ) re
ff20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
ff30: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
ff40: 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73 71  nTrans ){.    sq
ff50: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
ff60: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61  rse, "cannot sta
ff70: 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
ff80: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
ff90: 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ction");.    ret
ffa0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
ffb0: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
ffc0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
ffd0: 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  0);.  db->flags 
ffe0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  |= SQLITE_InTran
fff0: 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  s;.  db->onError
10000 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
10010 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
10020 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
10030 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72  d sqliteCommitTr
10040 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
10050 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
10060 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70  te *db;..  if( p
10070 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
10080 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
10090 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
100a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
100b0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
100c0 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
100d0 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
100e0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41  n;.  if( sqliteA
100f0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
10100 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
10110 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
10120 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
10130 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
10140 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
10150 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
10160 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10170 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d  "cannot commit -
10180 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
10190 69 73 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20  is active");.   
101a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64   return;.  }.  d
101b0 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
101c0 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73  ITE_InTrans;.  s
101d0 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
101e0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
101f0 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
10200 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f  OE_Default;.}../
10210 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
10220 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
10230 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61  oid sqliteRollba
10240 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
10250 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10260 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
10270 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
10280 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
10290 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
102a0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
102b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
102c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
102d0 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
102e0 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
102f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75  ;.  if( sqliteAu
10300 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10310 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
10320 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
10330 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  0) ) return;.  i
10340 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
10350 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
10360 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
10370 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10380 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63   "cannot rollbac
10390 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  k - no transacti
103a0 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b 0a  on is active");.
103b0 20 20 20 20 72 65 74 75 72 6e 3b 20 0a 20 20 7d      return; .  }
103c0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
103d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
103e0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
103f0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10400 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20  OP_Rollback, 0, 
10410 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  0);.  }.  db->fl
10420 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
10430 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e  nTrans;.  db->on
10440 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75  Error = OE_Defau
10450 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  lt;.}../*.** Gen
10460 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
10470 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
10480 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
10490 69 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61  ie for all.** na
104a0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
104b0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
104c0 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  teCodeVerifySche
104d0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
104e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
104f0 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
10500 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
10510 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
10520 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
10530 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
10540 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
10550 3d 31 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 69 5d  =1 || db->aDb[i]
10560 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  .pBt==0 ) contin
10570 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  ue;.    sqliteVd
10580 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
10590 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 2c 20 64  rifyCookie, i, d
105a0 62 2d 3e 61 44 62 5b 69 5d 2e 73 63 68 65 6d 61  b->aDb[i].schema
105b0 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 20 20  _cookie);.  }.  
105c0 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65  pParse->schemaVe
105d0 72 69 66 69 65 64 20 3d 20 31 3b 0a 7d 0a 0a 2f  rified = 1;.}../
105e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
105f0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
10600 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
10610 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
10620 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
10630 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
10640 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10650 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
10660 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
10670 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
10680 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
10690 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
106a0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
106b0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
106c0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
106d0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
106e0 69 66 20 74 68 65 20 73 65 74 43 68 65 63 6b 70  if the setCheckp
106f0 6f 69 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  oint parameter i
10700 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
10710 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
10720 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
10730 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
10740 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
10750 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
10760 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
10770 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
10780 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
10790 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
107a0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
107b0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
107c0 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
107d0 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
107e0 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
107f0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
10800 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
10810 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
10820 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
10830 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
10840 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
10850 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
10860 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
10870 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
10880 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  be set..**.** Th
10890 65 20 74 65 6d 70 4f 6e 6c 79 20 66 6c 61 67 20  e tempOnly flag 
108a0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6f  indicates that o
108b0 6e 6c 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nly temporary ta
108c0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 63 68 61  bles will be cha
108d0 6e 67 65 64 0a 2a 2a 20 64 75 72 69 6e 67 20 74  nged.** during t
108e0 68 69 73 20 77 72 69 74 65 20 6f 70 65 72 61 74  his write operat
108f0 69 6f 6e 2e 20 20 54 68 65 20 70 72 69 6d 61 72  ion.  The primar
10900 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  y database table
10910 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 65   is not.** write
10920 2d 6c 6f 63 6b 65 64 2e 20 20 4f 6e 6c 79 20 74  -locked.  Only t
10930 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
10940 61 62 61 73 65 20 66 69 6c 65 20 67 65 74 73 20  abase file gets 
10950 61 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  a write lock..**
10960 20 4f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   Other processes
10970 20 63 61 6e 20 63 6f 6e 74 69 6e 75 65 20 74 6f   can continue to
10980 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
10990 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62  he primary datab
109a0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  ase file..*/.voi
109b0 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69  d sqliteBeginWri
109c0 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
109d0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
109e0 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e  etCheckpoint, in
109f0 74 20 74 65 6d 70 4f 6e 6c 79 29 7b 0a 20 20 56  t tempOnly){.  V
10a00 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71  dbe *v;.  v = sq
10a10 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
10a20 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
10a30 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10a40 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
10a50 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69  k ) return; /* i
10a60 66 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74  f this is in a t
10a70 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28 20  rigger */.  if( 
10a80 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
10a90 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
10aa0 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ans)==0 ){.    s
10ab0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10ac0 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
10ad0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
10ae0 20 21 74 65 6d 70 4f 6e 6c 79 20 29 7b 0a 20 20   !tempOnly ){.  
10af0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10b00 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
10b10 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
10b20 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 56 65      sqliteCodeVe
10b30 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
10b40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
10b50 65 20 69 66 28 20 73 65 74 43 68 65 63 6b 70 6f  e if( setCheckpo
10b60 69 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  int ){.    sqlit
10b70 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10b80 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 30 2c 20  _Checkpoint, 0, 
10b90 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
10ba0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68  beAddOp(v, OP_Ch
10bb0 65 63 6b 70 6f 69 6e 74 2c 20 31 2c 20 30 29 3b  eckpoint, 1, 0);
10bc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
10bd0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
10be0 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70   concludes an op
10bf0 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79  eration that may
10c00 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a   have changed.**
10c10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10c20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61 6e  This is a compan
10c30 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ion function to 
10c40 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
10c50 69 6f 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74  ion()..** If a t
10c60 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
10c70 74 61 72 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d  tarted, then com
10c80 6d 69 74 20 69 74 2e 20 20 49 66 20 61 20 63 68  mit it.  If a ch
10c90 65 63 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20  eckpoint was.** 
10ca0 73 74 61 72 74 65 64 20 74 68 65 6e 20 63 6f 6d  started then com
10cb0 6d 69 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69  mit that..*/.voi
10cc0 64 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65  d sqliteEndWrite
10cd0 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
10ce0 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
10cf0 20 2a 76 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *v;.  if( pPars
10d00 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72  e->trigStack ) r
10d10 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69  eturn; /* if thi
10d20 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67 65  s is in a trigge
10d30 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  r */.  v = sqlit
10d40 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
10d50 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10d60 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
10d70 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
10d80 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
10d90 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74  ){.    /* Do Not
10da0 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
10db0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10dc0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
10dd0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 0, 0);.  }.}.
10de0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
10df0 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
10e00 6e 67 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20  ng as a boolean 
10e10 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
10e20 20 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28   int getBoolean(
10e30 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74  char *z){.  stat
10e40 69 63 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b  ic char *azTrue[
10e50 5d 20 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e  ] = { "yes", "on
10e60 22 2c 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69  ", "true" };.  i
10e70 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d  nt i;.  if( z[0]
10e80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10e90 20 20 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b    if( isdigit(z[
10ea0 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d  0]) || (z[0]=='-
10eb0 27 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31  ' && isdigit(z[1
10ec0 5d 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ])) ){.    retur
10ed0 6e 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20  n atoi(z);.  }. 
10ee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
10ef0 6f 66 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f  of(azTrue)/sizeo
10f00 66 28 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b  f(azTrue[0]); i+
10f10 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
10f20 74 65 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72  teStrICmp(z,azTr
10f30 75 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75  ue[i])==0 ) retu
10f40 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
10f50 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
10f60 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69 76  nterpret the giv
10f70 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 73  en string as a s
10f80 61 66 65 74 79 20 6c 65 76 65 6c 2e 20 20 52 65  afety level.  Re
10f90 74 75 72 6e 20 30 20 66 6f 72 20 4f 46 46 2c 0a  turn 0 for OFF,.
10fa0 2a 2a 20 31 20 66 6f 72 20 4f 4e 20 6f 72 20 4e  ** 1 for ON or N
10fb0 4f 52 4d 41 4c 20 61 6e 64 20 32 20 66 6f 72 20  ORMAL and 2 for 
10fc0 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  FULL..**.** Note
10fd0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
10fe0 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
10ff0 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
11000 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
11010 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
11020 69 6e 74 6f 20 73 71 6c 69 74 65 42 74 72 65 65  into sqliteBtree
11030 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 29  SetSafetyLevel()
11040 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a 2a  .  The is done.*
11050 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65 67  * to support leg
11060 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20 54  acy SQL code.  T
11070 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11080 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c 65  used to be boole
11090 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72 20  an.** and older 
110a0 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76 65  scripts may have
110b0 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30 20   used numbers 0 
110c0 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66 6f  for OFF and 1 fo
110d0 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  r ON..*/.static 
110e0 69 6e 74 20 67 65 74 53 61 66 65 74 79 4c 65 76  int getSafetyLev
110f0 65 6c 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73  el(char *z){.  s
11100 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
11110 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
11120 68 61 72 20 2a 7a 57 6f 72 64 3b 0a 20 20 20 20  har *zWord;.    
11130 69 6e 74 20 76 61 6c 3b 0a 20 20 7d 20 61 4b 65  int val;.  } aKe
11140 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e  y[] = {.    { "n
11150 6f 22 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  o",    0 },.    
11160 7b 20 22 6f 66 66 22 2c 20 20 20 30 20 7d 2c 0a  { "off",   0 },.
11170 20 20 20 20 7b 20 22 66 61 6c 73 65 22 2c 20 30      { "false", 0
11180 20 7d 2c 0a 20 20 20 20 7b 20 22 79 65 73 22 2c   },.    { "yes",
11190 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 6f     1 },.    { "o
111a0 6e 22 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  n",    1 },.    
111b0 7b 20 22 74 72 75 65 22 2c 20 20 31 20 7d 2c 0a  { "true",  1 },.
111c0 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 32      { "full",  2
111d0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
111e0 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20  ;.  if( z[0]==0 
111f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
11200 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20  ( isdigit(z[0]) 
11210 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  || (z[0]=='-' &&
11220 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20   isdigit(z[1])) 
11230 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74  ){.    return at
11240 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  oi(z);.  }.  for
11250 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
11260 4b 65 79 29 2f 73 69 7a 65 6f 66 28 61 4b 65 79  Key)/sizeof(aKey
11270 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
11280 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
11290 70 28 7a 2c 61 4b 65 79 5b 69 5d 2e 7a 57 6f 72  p(z,aKey[i].zWor
112a0 64 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  d)==0 ) return a
112b0 4b 65 79 5b 69 5d 2e 76 61 6c 3b 0a 20 20 7d 0a  Key[i].val;.  }.
112c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
112d0 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
112e0 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
112f0 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
11300 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
11310 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
11320 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a  AGMA id = value.
11330 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69  **.** The identi
11340 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  fier might also 
11350 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68  be a string.  Th
11360 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
11370 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e  ing, and.** iden
11380 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d  tifier, or a num
11390 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c  ber.  If minusFl
113a0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
113b0 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   the value is.**
113c0 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77   a number that w
113d0 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
113e0 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a   minus sign..*/.
113f0 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d  void sqlitePragm
11400 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
11410 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
11420 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e  oken *pRight, in
11430 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
11440 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b  char *zLeft = 0;
11450 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20  .  char *zRight 
11460 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  = 0;.  sqlite *d
11470 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11480 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
11490 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
114a0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
114b0 72 65 74 75 72 6e 3b 0a 0a 20 20 7a 4c 65 66 74  return;..  zLeft
114c0 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
114d0 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74  (pLeft->z, pLeft
114e0 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65  ->n);.  sqliteDe
114f0 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20  quote(zLeft);.  
11500 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
11510 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b  .    zRight = 0;
11520 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
11530 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22  tring(&zRight, "
11540 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a  -", 1, pRight->z
11550 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b  , pRight->n, 0);
11560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
11570 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72  ight = sqliteStr
11580 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20  NDup(pRight->z, 
11590 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20  pRight->n);.    
115a0 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52  sqliteDequote(zR
115b0 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
115c0 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
115d0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
115e0 50 52 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a  PRAGMA, zLeft, z
115f0 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
11600 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b  liteFree(zLeft);
11610 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11620 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  zRight);.    ret
11630 75 72 6e 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a  urn;.  }. .  /*.
11640 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
11650 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
11660 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
11670 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d  ault_cache_size=
11680 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
11690 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
116a0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ts the current p
116b0 65 72 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e  ersistent settin
116c0 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
116d0 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
116e0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
116f0 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ned is the maxim
11700 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  um number of.  *
11710 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  * pages in the p
11720 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  age cache.  The 
11730 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
11740 20 62 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e   both the curren
11750 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  t.  ** page cach
11760 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64  e size value and
11770 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
11780 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
11790 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65  value.  ** store
117a0 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
117b0 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e file..  **.  *
117c0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 61  * The default ca
117d0 63 68 65 20 73 69 7a 65 20 69 73 20 73 74 6f 72  che size is stor
117e0 65 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65  ed in meta-value
117f0 20 32 20 6f 66 20 70 61 67 65 20 31 20 6f 66 20   2 of page 1 of 
11800 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
11810 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63 61 63  e file.  The cac
11820 68 65 20 73 69 7a 65 20 69 73 20 61 63 74 75 61  he size is actua
11830 6c 6c 79 20 74 68 65 20 61 62 73 6f 6c 75 74 65  lly the absolute
11840 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74   value of.  ** t
11850 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  his memory locat
11860 69 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e 20 6f  ion.  The sign o
11870 66 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 64  f meta-value 2 d
11880 65 74 65 72 6d 69 6e 65 73 20 74 68 65 0a 20 20  etermines the.  
11890 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  ** synchronous s
118a0 65 74 74 69 6e 67 2e 20 20 41 20 6e 65 67 61 74  etting.  A negat
118b0 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20  ive value means 
118c0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
118d0 66 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f  ff.  ** and a po
118e0 73 69 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61  sitive value mea
118f0 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ns synchronous i
11900 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s on..  */.  if(
11910 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
11920 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 63 61  Left,"default_ca
11930 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b  che_size")==0 ){
11940 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
11950 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  Op getCacheSize[
11960 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
11970 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c  _ReadCookie,  0,
11980 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
11990 20 20 20 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c       { OP_AbsVal
119a0 75 65 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  ue,    0, 0,    
119b0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
119c0 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20  OP_Dup,         
119d0 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
119e0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
119f0 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
11a00 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11a10 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
11a20 20 20 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30    0, 6,        0
11a30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
11a40 74 65 67 65 72 2c 20 20 20 20 20 4d 41 58 5f 50  teger,     MAX_P
11a50 41 47 45 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20  AGES,0, 0},.    
11a60 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
11a70 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
11a80 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a   "cache_size"},.
11a90 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
11aa0 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
11ab0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
11ac0 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
11ad0 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
11ae0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11af0 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
11b00 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
11b10 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a  ze), getCacheSiz
11b20 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
11b30 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
11b40 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
11b50 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  atoi(zRight);.  
11b60 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
11b70 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
11b80 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e       sqliteBegin
11b90 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
11ba0 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
11bb0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11bc0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
11bd0 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20  r, size, 0);.   
11be0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11bf0 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
11c00 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  kie, 0, 2);.    
11c10 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
11c20 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11c30 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
11c40 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11c50 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30  ddOp(v, OP_Ge, 0
11c60 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
11c70 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11c80 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c  (v, OP_Negative,
11c90 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
11ca0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11cb0 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
11cc0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
11cd0 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
11ce0 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
11cf0 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a     db->cache_siz
11d00 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  e = db->cache_si
11d10 7a 65 3c 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73  ze<0 ? -size : s
11d20 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
11d30 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  eBtreeSetCacheSi
11d40 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
11d50 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  t, db->cache_siz
11d60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
11d70 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  e..  /*.  **  PR
11d80 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 0a  AGMA cache_size.
11d90 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
11da0 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  he_size=N.  **. 
11db0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
11dc0 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
11dd0 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74  urrent local set
11de0 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
11df0 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
11e00 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c 20 73 65  e.  The local se
11e10 74 74 69 6e 67 20 63 61 6e 20 62 65 20 64 69 66  tting can be dif
11e20 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20 20 2a 2a  ferent from.  **
11e30 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
11e40 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
11e50 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
11e60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
11e70 20 20 2a 2a 20 66 69 6c 65 20 69 74 73 65 6c 66    ** file itself
11e80 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
11e90 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78  urned is the max
11ea0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
11eb0 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65   ** pages in the
11ec0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68   page cache.  Th
11ed0 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
11ee0 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a  ts the local.  *
11ef0 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
11f00 65 20 76 61 6c 75 65 2e 20 20 49 74 20 64 6f 65  e value.  It doe
11f10 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
11f20 20 70 65 72 73 69 73 74 65 6e 74 0a 20 20 2a 2a   persistent.  **
11f30 20 63 61 63 68 65 20 73 69 7a 65 20 73 74 6f 72   cache size stor
11f40 65 64 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 73  ed on the disk s
11f50 6f 20 74 68 65 20 63 61 63 68 65 20 73 69 7a 65  o the cache size
11f60 20 77 69 6c 6c 20 72 65 76 65 72 74 0a 20 20 2a   will revert.  *
11f70 2a 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  * to its default
11f80 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
11f90 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
11fa0 65 64 20 61 6e 64 20 72 65 6f 70 65 6e 65 64 2e  ed and reopened.
11fb0 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c 64 20 62  .  ** N should b
11fc0 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
11fd0 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eger..  */.  if(
11fe0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
11ff0 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69 7a 65  Left,"cache_size
12000 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
12010 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 43 61  tic VdbeOp getCa
12020 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20  cheSize[] = {.  
12030 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
12040 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
12050 20 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d     "cache_size"}
12060 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
12070 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
12080 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
12090 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
120a0 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
120b0 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
120c0 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
120d0 3b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  ;;.      if( siz
120e0 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69  e<0 ) size = -si
120f0 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
12100 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12110 49 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c 20 30  Integer, size, 0
12120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
12130 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
12140 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61 63  ArraySize(getCac
12150 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68  heSize), getCach
12160 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  eSize);.    }els
12170 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  e{.      int siz
12180 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29  e = atoi(zRight)
12190 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
121a0 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
121b0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  e;.      if( db-
121c0 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 29 20  >cache_size<0 ) 
121d0 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
121e0 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69      db->cache_si
121f0 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20  ze = size;.     
12200 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43   sqliteBtreeSetC
12210 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  acheSize(db->aDb
12220 5b 30 5d 2e 70 42 74 2c 20 64 62 2d 3e 63 61 63  [0].pBt, db->cac
12230 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
12240 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
12250 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
12260 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  lt_synchronous. 
12270 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61   **  PRAGMA defa
12280 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ult_synchronous=
12290 4f 4e 7c 4f 46 46 7c 4e 4f 52 4d 41 4c 7c 46 55  ON|OFF|NORMAL|FU
122a0 4c 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  LL.  **.  ** The
122b0 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 74 75   first form retu
122c0 72 6e 73 20 74 68 65 20 70 65 72 73 69 73 74 65  rns the persiste
122d0 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
122e0 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65  "synchronous" se
122f0 74 74 69 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20  tting.  ** that 
12300 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
12310 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
12320 20 69 73 20 74 68 65 20 73 79 6e 63 68 72 6f 6e   is the synchron
12330 6f 75 73 20 73 65 74 74 69 6e 67 20 74 68 61 74  ous setting that
12340 0a 20 20 2a 2a 20 69 73 20 75 73 65 64 20 77 68  .  ** is used wh
12350 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62  enever the datab
12360 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 75 6e  ase is opened un
12370 6c 65 73 73 20 6f 76 65 72 72 69 64 64 65 6e 20  less overridden 
12380 62 79 20 61 20 73 65 70 61 72 61 74 65 0a 20 20  by a separate.  
12390 2a 2a 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22  ** "synchronous"
123a0 20 70 72 61 67 6d 61 2e 20 20 54 68 65 20 73 65   pragma.  The se
123b0 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65  cond form change
123c0 73 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  s the persistent
123d0 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f   and the.  ** lo
123e0 63 61 6c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  cal synchronous 
123f0 73 65 74 74 69 6e 67 20 74 6f 20 74 68 65 20 76  setting to the v
12400 61 6c 75 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a  alue given..  **
12410 0a 20 20 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f  .  ** If synchro
12420 6e 6f 75 73 20 69 73 20 4f 46 46 2c 20 53 51 4c  nous is OFF, SQL
12430 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  ite does not att
12440 65 6d 70 74 20 61 6e 79 20 66 73 79 6e 63 28 29  empt any fsync()
12450 20 73 79 73 74 65 6d 73 20 63 61 6c 6c 73 0a 20   systems calls. 
12460 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   ** to make sure
12470 20 64 61 74 61 20 69 73 20 63 6f 6d 6d 69 74 74   data is committ
12480 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 57 72 69  ed to disk.  Wri
12490 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  te operations ar
124a0 65 20 76 65 72 79 20 66 61 73 74 2c 0a 20 20 2a  e very fast,.  *
124b0 2a 20 62 75 74 20 61 20 70 6f 77 65 72 20 66 61  * but a power fa
124c0 69 6c 75 72 65 20 63 61 6e 20 6c 65 61 76 65 20  ilure can leave 
124d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
124e0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
124f0 73 74 61 74 65 2e 0a 20 20 2a 2a 20 49 66 20 73  state..  ** If s
12500 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 4f 4e  ynchronous is ON
12510 20 6f 72 20 4e 4f 52 4d 41 4c 2c 20 53 51 4c 69   or NORMAL, SQLi
12520 74 65 20 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73  te will do an fs
12530 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
12540 6c 20 74 6f 0a 20 20 2a 2a 20 6d 61 6b 65 20 73  l to.  ** make s
12550 75 72 65 20 64 61 74 61 20 69 73 20 62 65 69 6e  ure data is bein
12560 67 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  g written to dis
12570 6b 2e 20 20 54 68 65 20 72 69 73 6b 20 6f 66 20  k.  The risk of 
12580 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 65 20 74  corruption due t
12590 6f 0a 20 20 2a 2a 20 61 20 70 6f 77 65 72 20 6c  o.  ** a power l
125a0 6f 73 73 20 69 6e 20 74 68 69 73 20 6d 6f 64 65  oss in this mode
125b0 20 69 73 20 6e 65 67 6c 69 67 69 62 6c 65 20 62   is negligible b
125c0 75 74 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  ut non-zero.  If
125d0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a   synchronous.  *
125e0 2a 20 69 73 20 46 55 4c 4c 2c 20 65 78 74 72 61  * is FULL, extra
125f0 20 66 73 79 6e 63 28 29 73 20 6f 63 63 75 72 20   fsync()s occur 
12600 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 72 69  to reduce the ri
12610 73 6b 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  sk of corruption
12620 20 74 6f 20 6e 65 61 72 0a 20 20 2a 2a 20 7a 65   to near.  ** ze
12630 72 6f 2c 20 62 75 74 20 77 69 74 68 20 61 20 77  ro, but with a w
12640 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
12650 20 70 65 6e 61 6c 74 79 2e 20 20 54 68 65 20 64   penalty.  The d
12660 65 66 61 75 6c 74 20 6d 6f 64 65 20 69 73 20 4e  efault mode is N
12670 4f 52 4d 41 4c 2e 0a 20 20 2a 2f 0a 20 20 69 66  ORMAL..  */.  if
12680 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
12690 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 73  zLeft,"default_s
126a0 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20  ynchronous")==0 
126b0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
126c0 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d  beOp getSync[] =
126d0 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f   {.      { OP_Co
126e0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
126f0 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f          "synchro
12700 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20  nous"},.      { 
12710 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
12720 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
12730 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c  .      { OP_Dup,
12740 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20           0, 0,  
12750 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
12760 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20  { OP_If,        
12770 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
12780 7d 2c 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  },  /* 3 */.    
12790 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
127a0 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20  e,  0, 2,       
127b0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
127c0 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
127d0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
127e0 20 20 20 20 7b 20 4f 50 5f 4c 74 2c 20 20 20 20      { OP_Lt,    
127f0 20 20 20 20 20 20 30 2c 20 35 2c 20 20 20 20 20        0, 5,     
12800 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
12810 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31  P_AddImm,      1
12820 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
12830 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
12840 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
12850 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
12860 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20   OP_Halt,       
12870 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
12880 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64  ,.      { OP_Add
12890 49 6d 6d 2c 20 20 20 20 20 2d 31 2c 20 30 2c 20  Imm,     -1, 0, 
128a0 20 20 20 20 20 20 20 30 7d 2c 20 20 2f 2a 20 31         0},  /* 1
128b0 30 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0 */.      { OP_
128c0 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
128d0 30 2c 20 20 20 20 20 20 20 20 30 7d 0a 20 20 20  0,        0}.   
128e0 20 7d 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67   };.    if( pRig
128f0 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20  ht->z==pLeft->z 
12900 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
12910 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
12920 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
12930 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67  Size(getSync), g
12940 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 73  etSync);.      s
12950 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
12960 32 28 76 2c 20 61 64 64 72 2b 33 2c 20 61 64 64  2(v, addr+3, add
12970 72 2b 31 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r+10);.    }else
12980 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
12990 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  ;.      int size
129a0 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a   = db->cache_siz
129b0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  e;.      if( siz
129c0 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69  e<0 ) size = -si
129d0 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
129e0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
129f0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ion(pParse, 0, 0
12a00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
12a10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
12a20 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29  eadCookie, 0, 2)
12a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
12a40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
12a50 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
12a60 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
12a70 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
12a80 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
12a90 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12aa0 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20  Op(v, OP_Ne, 0, 
12ab0 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
12ac0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12ad0 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 4d 41 58  , OP_AddImm, MAX
12ae0 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20 20 20 20  _PAGES, 0);.    
12af0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12b00 70 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65  p(v, OP_AbsValue
12b10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  , 0, 0);.      d
12b20 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
12b30 3d 20 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c  = getSafetyLevel
12b40 28 7a 52 69 67 68 74 29 2b 31 3b 0a 20 20 20 20  (zRight)+1;.    
12b50 20 20 69 66 28 20 64 62 2d 3e 73 61 66 65 74 79    if( db->safety
12b60 5f 6c 65 76 65 6c 3d 3d 31 20 29 7b 0a 20 20 20  _level==1 ){.   
12b70 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12b80 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74  ddOp(v, OP_Negat
12b90 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ive, 0, 0);.    
12ba0 20 20 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65      size = -size
12bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12bc0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12bd0 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
12be0 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
12bf0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12c00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
12c10 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2c 20 30  >safety_level, 0
12c20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
12c30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
12c40 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 33 29 3b  etCookie, 0, 3);
12c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64  .      sqliteEnd
12c60 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
12c70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62  Parse);.      db
12c80 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73  ->cache_size = s
12c90 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
12ca0 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  eBtreeSetCacheSi
12cb0 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
12cc0 74 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  t, db->cache_siz
12cd0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
12ce0 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
12cf0 76 65 6c 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  vel(db->aDb[0].p
12d00 42 74 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c  Bt, db->safety_l
12d10 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
12d20 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
12d30 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
12d40 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47  nous.  **   PRAG
12d50 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  MA synchronous=O
12d60 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c  FF|ON|NORMAL|FUL
12d70 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  L.  **.  ** Retu
12d80 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
12d90 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
12da0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61   synchronous fla
12db0 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
12dc0 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  * the local valu
12dd0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
12de0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
12df0 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65  isk file and the
12e00 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61  .  ** default va
12e10 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74  lue will be rest
12e20 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  ored the next ti
12e30 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  me the database 
12e40 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a  is.  ** opened..
12e50 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
12e60 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
12e70 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30  synchronous")==0
12e80 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
12e90 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20  dbeOp getSync[] 
12ea0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  = {.      { OP_C
12eb0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
12ec0 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72  ,        "synchr
12ed0 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b  onous"},.      {
12ee0 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
12ef0 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
12f00 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 66 28  ,.    };.    if(
12f10 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
12f20 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  t->z ){.      sq
12f30 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12f40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
12f50 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 2c  >safety_level-1,
12f60 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12f70 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
12f80 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 53  , ArraySize(getS
12f90 79 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a  ync), getSync);.
12fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fb0 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e   int size = db->
12fc0 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20  cache_size;.    
12fd0 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73    if( size<0 ) s
12fe0 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
12ff0 20 20 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65     db->safety_le
13000 76 65 6c 20 3d 20 67 65 74 53 61 66 65 74 79 4c  vel = getSafetyL
13010 65 76 65 6c 28 7a 52 69 67 68 74 29 2b 31 3b 0a  evel(zRight)+1;.
13020 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 73 61        if( db->sa
13030 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 31 20 29 20  fety_level==1 ) 
13040 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
13050 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69      db->cache_si
13060 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20  ze = size;.     
13070 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43   sqliteBtreeSetC
13080 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  acheSize(db->aDb
13090 5b 30 5d 2e 70 42 74 2c 20 64 62 2d 3e 63 61 63  [0].pBt, db->cac
130a0 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  he_size);.      
130b0 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 53 61  sqliteBtreeSetSa
130c0 66 65 74 79 4c 65 76 65 6c 28 64 62 2d 3e 61 44  fetyLevel(db->aD
130d0 62 5b 30 5d 2e 70 42 74 2c 20 64 62 2d 3e 73 61  b[0].pBt, db->sa
130e0 66 65 74 79 5f 6c 65 76 65 6c 29 3b 0a 20 20 20  fety_level);.   
130f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
13100 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
13110 7a 4c 65 66 74 2c 20 22 74 72 69 67 67 65 72 5f  zLeft, "trigger_
13120 6f 76 65 72 68 65 61 64 5f 74 65 73 74 22 29 3d  overhead_test")=
13130 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
13140 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
13150 20 29 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73   ){.      always
13160 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65  _code_trigger_se
13170 74 75 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  tup = 1;.    }el
13180 73 65 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73  se{.      always
13190 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65  _code_trigger_se
131a0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tup = 0;.    }. 
131b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
131c0 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
131d0 74 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29  t, "vdbe_trace")
131e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
131f0 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
13200 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
13210 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56  lags |= SQLITE_V
13220 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65  dbeTrace;.    }e
13230 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
13240 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
13250 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d  VdbeTrace;.    }
13260 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
13270 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
13280 65 66 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d  eft, "full_colum
13290 6e 5f 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a  n_names")==0 ){.
132a0 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
132b0 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
132c0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
132d0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
132e0 61 6d 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ames;.    }else{
132f0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
13300 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
13310 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a  ColNames;.    }.
13320 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
13330 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
13340 66 74 2c 20 22 73 68 6f 77 5f 64 61 74 61 74 79  ft, "show_dataty
13350 70 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pes")==0 ){.    
13360 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
13370 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
13380 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
13390 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b  ITE_ReportTypes;
133a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
133b0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
133c0 53 51 4c 49 54 45 5f 52 65 70 6f 72 74 54 79 70  SQLITE_ReportTyp
133d0 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  es;.    }.  }els
133e0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
133f0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 72  trICmp(zLeft, "r
13400 65 73 75 6c 74 5f 73 65 74 5f 64 65 74 61 69 6c  esult_set_detail
13410 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  s")==0 ){.    if
13420 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  ( getBoolean(zRi
13430 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62  ght) ){.      db
13440 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
13450 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b  E_ResultDetails;
13460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13470 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
13480 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74  SQLITE_ResultDet
13490 61 69 6c 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ails;.    }.  }e
134a0 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
134b0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
134c0 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 22 29  "count_changes")
134d0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
134e0 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
134f0 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
13500 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43  lags |= SQLITE_C
13510 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 65  ountRows;.    }e
13520 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
13530 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
13540 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d  CountRows;.    }
13550 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
13560 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
13570 65 66 74 2c 20 22 65 6d 70 74 79 5f 72 65 73 75  eft, "empty_resu
13580 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 22 29 3d 3d  lt_callbacks")==
13590 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
135a0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
135b0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
135c0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4e 75 6c  gs |= SQLITE_Nul
135d0 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  lCallback;.    }
135e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e  else{.      db->
135f0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
13600 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20  _NullCallback;. 
13610 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
13620 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
13630 70 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c 65 5f  p(zLeft, "table_
13640 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  info")==0 ){.   
13650 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
13660 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
13670 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69  indTable(db, zRi
13680 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ght, 0);.    if(
13690 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   pTab ){.      s
136a0 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62  tatic VdbeOp tab
136b0 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20  leInfoPreface[] 
136c0 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
136d0 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c  _ColumnName,  0,
136e0 20 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d   0,       "cid"}
136f0 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
13700 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30  olumnName,  1, 0
13710 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c  ,       "name"},
13720 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
13730 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c  lumnName,  2, 0,
13740 20 20 20 20 20 20 20 22 74 79 70 65 22 7d 2c 0a         "type"},.
13750 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
13760 75 6d 6e 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20  umnName,  3, 0, 
13770 20 20 20 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d        "notnull"}
13780 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
13790 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30  olumnName,  4, 0
137a0 2c 20 20 20 20 20 20 20 22 64 66 6c 74 5f 76 61  ,       "dflt_va
137b0 6c 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  lue"},.      };.
137c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
137d0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
137e0 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
137f0 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65  ize(tableInfoPre
13800 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f  face), tableInfo
13810 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20  Preface);.      
13820 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
13830 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
13840 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f   pTab);.      fo
13850 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
13860 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
13870 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13880 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
13890 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
138a0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
138b0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
138c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
138d0 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
138e0 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43  (v, -1, pTab->aC
138f0 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f  ol[i].zName, P3_
13900 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
13910 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
13920 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
13930 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13940 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
13950 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20  (v, -1, .       
13960 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
13970 5d 2e 7a 54 79 70 65 20 3f 20 70 54 61 62 2d 3e  ].zType ? pTab->
13980 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a 20  aCol[i].zType : 
13990 22 6e 75 6d 65 72 69 63 22 2c 20 50 33 5f 53 54  "numeric", P3_ST
139a0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
139b0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
139c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
139d0 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
139e0 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ull, 0);.       
139f0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
13a00 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
13a10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
13a20 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
13a30 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43  (v, -1, pTab->aC
13a40 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f  ol[i].zDflt, P3_
13a50 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
13a60 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
13a70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
13a80 20 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   5, 0);.      }.
13a90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
13aa0 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
13ab0 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78  mp(zLeft, "index
13ac0 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  _info")==0 ){.  
13ad0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
13ae0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
13af0 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74      pIdx = sqlit
13b00 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  eFindIndex(db, z
13b10 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 69  Right, 0);.    i
13b20 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
13b30 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
13b40 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
13b50 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
13b60 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
13b70 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65 71  0, 0,       "seq
13b80 6e 6f 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  no"},.        { 
13b90 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
13ba0 31 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69 64  1, 0,       "cid
13bb0 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
13bc0 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c  _ColumnName,  2,
13bd0 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22   0,       "name"
13be0 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
13bf0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70    int i;.      p
13c00 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
13c10 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  le;.      sqlite
13c20 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
13c30 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65   ArraySize(table
13c40 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61  InfoPreface), ta
13c50 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b  bleInfoPreface);
13c60 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
13c70 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
13c80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
13c90 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e  nt cnum = pIdx->
13ca0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
13cb0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
13cc0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
13cd0 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  er, i, 0);.     
13ce0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13cf0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
13d00 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20  , cnum, 0);.    
13d10 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13d20 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
13d30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
13d40 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
13d50 43 6f 6c 3e 63 6e 75 6d 20 29 3b 0a 20 20 20 20  Col>cnum );.    
13d60 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
13d70 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
13d80 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a  ab->aCol[cnum].z
13d90 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
13da0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13db0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13dc0 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b  Callback, 3, 0);
13dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13de0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
13df0 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
13e00 74 2c 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29  t, "index_list")
13e10 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
13e20 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
13e30 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61  e *pTab;.    pTa
13e40 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
13e50 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
13e60 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  0);.    if( pTab
13e70 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71   ){.      v = sq
13e80 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
13e90 73 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20  se);.      pIdx 
13ea0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
13eb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
13ec0 61 62 20 26 26 20 70 49 64 78 20 29 7b 0a 20 20  ab && pIdx ){.  
13ed0 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a      int i = 0; .
13ee0 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62        static Vdb
13ef0 65 4f 70 20 69 6e 64 65 78 4c 69 73 74 50 72 65  eOp indexListPre
13f00 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  face[] = {.     
13f10 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
13f20 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
13f30 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20 20 20   "seq"},.       
13f40 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
13f50 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  1, 0,       "
13f60 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  name"},.        
13f70 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
13f80 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 75    2, 0,       "u
13f90 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d  nique"},.      }
13fa0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ;..      sqliteV
13fb0 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
13fc0 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65 78 4c  ArraySize(indexL
13fd0 69 73 74 50 72 65 66 61 63 65 29 2c 20 69 6e 64  istPreface), ind
13fe0 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 3b 0a  exListPreface);.
13ff0 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64 78        while(pIdx
14000 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14010 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
14020 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
14030 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
14040 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
14050 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
14060 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
14070 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
14080 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pIdx->zName, P3_
14090 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
140a0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
140b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
140c0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
140d0 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20  E_None, 0);.    
140e0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
140f0 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
14100 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20  ck, 3, 0);.     
14110 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20     ++i;.        
14120 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65  pIdx = pIdx->pNe
14130 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
14140 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
14150 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
14160 4c 65 66 74 2c 20 22 64 61 74 61 62 61 73 65 5f  Left, "database_
14170 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
14180 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74   int i;.    stat
14190 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65 78 4c  ic VdbeOp indexL
141a0 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b  istPreface[] = {
141b0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
141c0 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
141d0 20 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20 20       "seq"},.   
141e0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
141f0 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
14200 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 7d 3b   "name"},.    };
14210 0a 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ..    sqliteVdbe
14220 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
14230 61 79 53 69 7a 65 28 69 6e 64 65 78 4c 69 73 74  aySize(indexList
14240 50 72 65 66 61 63 65 29 2c 20 69 6e 64 65 78 4c  Preface), indexL
14250 69 73 74 50 72 65 66 61 63 65 29 3b 0a 20 20 20  istPreface);.   
14260 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14270 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14280 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
14290 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pBt==0 ) continu
142a0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
142b0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d   db->aDb[i].zNam
142c0 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e!=0 );.      sq
142d0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
142e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
142f0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
14300 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14310 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
14320 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
14330 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 64  hangeP3(v, -1, d
14340 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c  b->aDb[i].zName,
14350 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
14360 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
14370 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
14380 6b 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  k, 2, 0);.    }.
14390 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
143a0 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 73 71   NDEBUG.  if( sq
143b0 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
143c0 74 2c 20 22 70 61 72 73 65 72 5f 74 72 61 63 65  t, "parser_trace
143d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74  ")==0 ){.    ext
143e0 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 50  ern void sqliteP
143f0 61 72 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a  arserTrace(FILE*
14400 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69  , char *);.    i
14410 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
14420 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73  ight) ){.      s
14430 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65  qliteParserTrace
14440 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72  (stdout, "parser
14450 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : ");.    }else{
14460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72  .      sqlitePar
14470 73 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a  serTrace(0, 0);.
14480 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
14490 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
144a0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
144b0 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63   "integrity_chec
144c0 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  k")==0 ){.    st
144d0 61 74 69 63 20 56 64 62 65 4f 70 20 63 68 65 63  atic VdbeOp chec
144e0 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  kDb[] = {.      
144f0 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20  { OP_SetInsert, 
14500 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
14510 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  2"},.      { OP_
14520 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
14530 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  0,        0},   
14540 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
14550 52 65 61 64 2c 20 20 20 20 30 2c 20 32 2c 20 20  Read,    0, 2,  
14560 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
14570 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
14580 20 20 30 2c 20 37 2c 20 20 20 20 20 20 20 20 30    0, 7,        0
14590 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
145a0 6c 75 6d 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c  lumn,      0, 3,
145b0 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
145c0 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 4 */.      { O
145d0 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30  P_SetInsert,   0
145e0 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
145f0 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
14600 20 20 20 20 20 20 20 20 30 2c 20 34 2c 20 20 20          0, 4,   
14610 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
14620 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c   OP_IntegrityCk,
14630 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
14640 2c 20 20 20 20 2f 2a 20 37 20 2a 2f 0a 20 20 20  ,    /* 7 */.   
14650 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
14660 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
14670 20 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65    "integrity_che
14680 63 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  ck"},.      { OP
14690 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
146a0 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
146b0 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
146c0 65 72 74 2c 20 20 20 31 2c 20 30 2c 20 20 20 20  ert,   1, 0,    
146d0 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20      "2"},.      
146e0 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
146f0 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
14700 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70  },.      { OP_Op
14710 65 6e 52 65 61 64 2c 20 20 20 20 31 2c 20 32 2c  enRead,    1, 2,
14720 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
14730 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
14740 20 20 20 20 31 2c 20 31 37 2c 20 20 20 20 20 20      1, 17,      
14750 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
14760 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 31 2c 20  Column,      1, 
14770 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  3,        0},   
14780 20 2f 2a 20 31 34 20 2a 2f 0a 20 20 20 20 20 20   /* 14 */.      
14790 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20  { OP_SetInsert, 
147a0 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
147b0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
147c0 78 74 2c 20 20 20 20 20 20 20 20 31 2c 20 31 34  xt,        1, 14
147d0 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
147e0 20 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74 79    { OP_Integrity
147f0 43 6b 2c 20 31 2c 20 31 2c 20 20 20 20 20 20 20  Ck, 1, 1,       
14800 20 30 7d 2c 20 20 20 20 2f 2a 20 31 37 20 2a 2f   0},    /* 17 */
14810 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
14820 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
14830 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
14840 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
14850 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
14860 79 53 69 7a 65 28 63 68 65 63 6b 44 62 29 2c 20  ySize(checkDb), 
14870 63 68 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73  checkDb);.  }els
14880 65 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65  e..  {}.  sqlite
14890 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73  Free(zLeft);.  s
148a0 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68 74  qliteFree(zRight
148b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
148c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
148d0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
148e0 20 74 6f 20 70 72 6f 63 65 73 73 20 61 6e 20 41   to process an A
148f0 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 3a  TTACH statement:
14900 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 54 54 41 43  .**.**     ATTAC
14910 48 20 44 41 54 41 42 41 53 45 20 66 69 6c 65 6e  H DATABASE filen
14920 61 6d 65 20 41 53 20 64 62 6e 61 6d 65 0a 2a 2a  ame AS dbname.**
14930 0a 2a 2a 20 54 68 65 20 70 46 69 6c 65 6e 61 6d  .** The pFilenam
14940 65 20 61 6e 64 20 70 44 62 6e 61 6d 65 20 61 72  e and pDbname ar
14950 67 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20  guments are the 
14960 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 66 69  tokens that defi
14970 6e 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 6e 61  ne the.** filena
14980 6d 65 20 61 6e 64 20 64 62 6e 61 6d 65 20 69 6e  me and dbname in
14990 20 74 68 65 20 41 54 54 41 43 48 20 73 74 61 74   the ATTACH stat
149a0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
149b0 71 6c 69 74 65 41 74 74 61 63 68 28 50 61 72 73  qliteAttach(Pars
149c0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
149d0 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 54 6f 6b   *pFilename, Tok
149e0 65 6e 20 2a 70 44 62 6e 61 6d 65 29 7b 0a 20 20  en *pDbname){.  
149f0 44 62 20 2a 61 4e 65 77 3b 0a 20 20 69 6e 74 20  Db *aNew;.  int 
14a00 72 63 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  rc, i;.  char *z
14a10 46 69 6c 65 2c 20 2a 7a 4e 61 6d 65 3b 0a 20 20  File, *zName;.  
14a20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
14a30 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
14a40 69 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  in ) return;.  d
14a50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14a60 20 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66    if( db->file_f
14a70 6f 72 6d 61 74 3c 34 20 29 7b 0a 20 20 20 20 73  ormat<4 ){.    s
14a80 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
14a90 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61 74  arse, "cannot at
14aa0 74 61 63 68 20 61 75 78 69 6c 69 61 72 79 20 64  tach auxiliary d
14ab0 61 74 61 62 61 73 65 73 20 74 6f 20 61 6e 20 22  atabases to an "
14ac0 0a 20 20 20 20 20 20 20 22 6f 6c 64 65 72 20 66  .       "older f
14ad0 6f 72 6d 61 74 20 6d 61 73 74 65 72 20 64 61 74  ormat master dat
14ae0 61 62 61 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  abase", 0);.    
14af0 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
14b00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
14b10 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
14b20 20 64 62 2d 3e 6e 44 62 3e 3d 4d 41 58 5f 41 54   db->nDb>=MAX_AT
14b30 54 41 43 48 45 44 2b 32 20 29 7b 0a 20 20 20 20  TACHED+2 ){.    
14b40 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
14b50 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
14b60 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
14b70 73 65 73 20 2d 20 6d 61 78 20 25 64 22 2c 20 0a  ses - max %d", .
14b80 20 20 20 20 20 20 20 4d 41 58 5f 41 54 54 41 43         MAX_ATTAC
14b90 48 45 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  HED);.    pParse
14ba0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
14bb0 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ROR;.    return;
14bc0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 61  .  }.  if( db->a
14bd0 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db==db->aDbStati
14be0 63 20 29 7b 0a 20 20 20 20 61 4e 65 77 20 3d 20  c ){.    aNew = 
14bf0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
14c00 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
14c10 2a 33 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  *3 );.    if( aN
14c20 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
14c30 20 20 20 20 6d 65 6d 63 70 79 28 61 4e 65 77 2c      memcpy(aNew,
14c40 20 64 62 2d 3e 61 44 62 2c 20 73 69 7a 65 6f 66   db->aDb, sizeof
14c50 28 64 62 2d 3e 61 44 62 5b 30 5d 29 2a 32 29 3b  (db->aDb[0])*2);
14c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 4e  .  }else{.    aN
14c70 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
14c80 6f 63 28 64 62 2d 3e 61 44 62 2c 20 73 69 7a 65  oc(db->aDb, size
14c90 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 2a 28  of(db->aDb[0])*(
14ca0 64 62 2d 3e 6e 44 62 2b 31 29 20 29 3b 0a 20 20  db->nDb+1) );.  
14cb0 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20    if( aNew==0 ) 
14cc0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62  return;.  }.  db
14cd0 2d 3e 61 44 62 20 3d 20 61 4e 65 77 3b 0a 20 20  ->aDb = aNew;.  
14ce0 61 4e 65 77 20 3d 20 26 64 62 2d 3e 61 44 62 5b  aNew = &db->aDb[
14cf0 64 62 2d 3e 6e 44 62 2b 2b 5d 3b 0a 20 20 6d 65  db->nDb++];.  me
14d00 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69  mset(aNew, 0, si
14d10 7a 65 6f 66 28 2a 61 4e 65 77 29 29 3b 0a 20 20  zeof(*aNew));.  
14d20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
14d30 61 4e 65 77 2d 3e 74 62 6c 48 61 73 68 2c 20 53  aNew->tblHash, S
14d40 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
14d50 47 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 48  G, 0);.  sqliteH
14d60 61 73 68 49 6e 69 74 28 26 61 4e 65 77 2d 3e 69  ashInit(&aNew->i
14d70 64 78 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  dxHash, SQLITE_H
14d80 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
14d90 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74    sqliteHashInit
14da0 28 26 61 4e 65 77 2d 3e 74 72 69 67 48 61 73 68  (&aNew->trigHash
14db0 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
14dc0 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73 71 6c 69  RING, 0);.  sqli
14dd0 74 65 48 61 73 68 49 6e 69 74 28 26 61 4e 65 77  teHashInit(&aNew
14de0 2d 3e 61 46 4b 65 79 2c 20 53 51 4c 49 54 45 5f  ->aFKey, SQLITE_
14df0 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b  HASH_STRING, 1);
14e00 0a 20 20 0a 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  .  .  zName = 0;
14e10 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
14e20 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 70 44 62 6e  ing(&zName, pDbn
14e30 61 6d 65 2d 3e 7a 2c 20 70 44 62 6e 61 6d 65 2d  ame->z, pDbname-
14e40 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 4e  >n, 0);.  if( zN
14e50 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
14e60 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
14e70 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  (zName);.  for(i
14e80 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
14e90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
14ea0 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 26 26  >aDb[i].zName &&
14eb0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 64   sqliteStrICmp(d
14ec0 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c  b->aDb[i].zName,
14ed0 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
14ee0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
14ef0 73 67 28 70 50 61 72 73 65 2c 20 22 64 61 74 61  sg(pParse, "data
14f00 62 61 73 65 20 25 7a 20 69 73 20 61 6c 72 65 61  base %z is alrea
14f10 64 79 20 69 6e 20 75 73 65 22 2c 20 7a 4e 61 6d  dy in use", zNam
14f20 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44  e);.      db->nD
14f30 62 2d 2d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  b--;.      pPars
14f40 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
14f50 52 52 4f 52 3b 0a 20 20 20 20 20 20 72 65 74 75  RROR;.      retu
14f60 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
14f70 61 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  aNew->zName = zN
14f80 61 6d 65 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 30  ame;.  zFile = 0
14f90 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74  ;.  sqliteSetNSt
14fa0 72 69 6e 67 28 26 7a 46 69 6c 65 2c 20 70 46 69  ring(&zFile, pFi
14fb0 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65  lename->z, pFile
14fc0 6e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69  name->n, 0);.  i
14fd0 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20 72 65  f( zFile==0 ) re
14fe0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44 65  turn;.  sqliteDe
14ff0 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20 20  quote(zFile);.  
15000 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  rc = sqliteBtree
15010 4f 70 65 6e 28 7a 46 69 6c 65 2c 20 30 2c 20 4d  Open(zFile, 0, M
15020 41 58 5f 50 41 47 45 53 2c 20 26 61 4e 65 77 2d  AX_PAGES, &aNew-
15030 3e 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 20  >pBt);.  if( rc 
15040 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
15050 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
15060 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
15070 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 46 69  tabase: %s", zFi
15080 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  le);.  }.  sqlit
15090 65 46 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  eFree(zFile);.  
150a0 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
150b0 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64  LITE_Initialized
150c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
150d0 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
150e0 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69 74   rc = sqliteInit
150f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 70 50  (pParse->db, &pP
15100 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  arse->zErrMsg);.
15110 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15120 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72  sqliteResetInter
15130 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
15140 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
15150 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
15160 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
15170 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
15180 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15190 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
151a0 70 61 72 73 65 72 20 74 6f 20 70 72 6f 63 65 73  parser to proces
151b0 73 20 61 20 44 45 54 41 43 48 20 73 74 61 74 65  s a DETACH state
151c0 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 44  ment:.**.**    D
151d0 45 54 41 43 48 20 44 41 54 41 42 41 53 45 20 64  ETACH DATABASE d
151e0 62 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bname.**.** The 
151f0 70 44 62 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  pDbname argument
15200 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
15210 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
15220 74 68 65 20 44 45 54 41 43 48 20 73 74 61 74 65  the DETACH state
15230 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
15240 6c 69 74 65 44 65 74 61 63 68 28 50 61 72 73 65  liteDetach(Parse
15250 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
15260 2a 70 44 62 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  *pDbname){.  int
15270 20 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   i;.  sqlite *db
15280 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
15290 3e 65 78 70 6c 61 69 6e 20 29 20 72 65 74 75 72  >explain ) retur
152a0 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
152b0 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ->db;.  for(i=0;
152c0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
152d0 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
152e0 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 7c 7c 20 64  b[i].pBt==0 || d
152f0 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 3d  b->aDb[i].zName=
15300 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
15310 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 64 62     if( strlen(db
15320 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 21  ->aDb[i].zName)!
15330 3d 70 44 62 6e 61 6d 65 2d 3e 6e 20 29 20 63 6f  =pDbname->n ) co
15340 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15350 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 64  sqliteStrNICmp(d
15360 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c  b->aDb[i].zName,
15370 20 70 44 62 6e 61 6d 65 2d 3e 7a 2c 20 70 44 62   pDbname->z, pDb
15380 6e 61 6d 65 2d 3e 6e 29 3d 3d 30 20 29 20 62 72  name->n)==0 ) br
15390 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
153a0 3e 3d 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20  >=db->nDb ){.   
153b0 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
153c0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
153d0 20 64 61 74 61 62 61 73 65 3a 20 25 54 22 2c 20   database: %T", 
153e0 70 44 62 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  pDbname);.    re
153f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
15400 69 3c 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<2 ){.    sqlit
15410 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
15420 2c 20 22 63 61 6e 6e 6f 74 20 64 65 74 61 63 68  , "cannot detach
15430 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
15440 44 62 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  Dbname);.    ret
15450 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
15460 65 42 74 72 65 65 43 6c 6f 73 65 28 64 62 2d 3e  eBtreeClose(db->
15470 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[i].pBt);.  d
15480 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 3d 20  b->aDb[i].pBt = 
15490 30 3b 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74  0;.  sqliteReset
154a0 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
154b0 62 2c 20 69 29 3b 0a 20 20 64 62 2d 3e 6e 44 62  b, i);.  db->nDb
154c0 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 64 62 2d 3e  --;.  if( i<db->
154d0 6e 44 62 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  nDb ){.    db->a
154e0 44 62 5b 69 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[i] = db->aDb[
154f0 64 62 2d 3e 6e 44 62 5d 3b 0a 20 20 20 20 6d 65  db->nDb];.    me
15500 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 64 62  mset(&db->aDb[db
15510 2d 3e 6e 44 62 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nDb], 0, sizeo
15520 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
15530 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49      sqliteResetI
15540 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
15550 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a              , i);.  }.}.