/ Hex Artifact Content
Login

Artifact 77b910f739174b0655f052ce8c1a7a0f01d3bfca:


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 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 31 34 34 20 32 30 30 33 2f 30 34 2f 31 33 20 31  144 2003/04/13 1
0300: 38 3a 32 36 3a 35 31 20 70 61 75 6c 20 45 78 70  8:26:51 paul Exp
0310: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0320: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0330: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0340: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0350: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
0360: 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61  en a new SQL sta
0370: 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e  tement is beginn
0380: 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72  ing to.** be par
0390: 73 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  sed.  Check to s
03a0: 65 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61  ee if the schema
03b0: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
03c0: 65 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  e needs.** to be
03d0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53   read from the S
03e0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64  QLITE_MASTER and
03f0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53   SQLITE_TEMP_MAS
0400: 54 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49  TER tables..** I
0410: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20  f it does, then 
0420: 72 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  read it..*/.void
0430: 20 73 71 6c 69 74 65 42 65 67 69 6e 50 61 72 73   sqliteBeginPars
0440: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0450: 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67   int explainFlag
0460: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  ){.  sqlite *db 
0470: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0480: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
0490: 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20  = explainFlag;. 
04a0: 20 69 66 28 28 64 62 2d 3e 66 6c 61 67 73 20 26   if((db->flags &
04b0: 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69   SQLITE_Initiali
04c0: 7a 65 64 29 3d 3d 30 20 26 26 20 70 50 61 72 73  zed)==0 && pPars
04d0: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29  e->initFlag==0 )
04e0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
04f0: 71 6c 69 74 65 49 6e 69 74 28 64 62 2c 20 26 70  qliteInit(db, &p
0500: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
0510: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
0520: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
0530: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
0540: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
0550: 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Err++;.    }.  }
0560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
0570: 73 20 61 20 66 61 6b 65 20 63 61 6c 6c 62 61 63  s a fake callbac
0580: 6b 20 70 72 6f 63 65 64 75 72 65 20 75 73 65 64  k procedure used
0590: 20 77 68 65 6e 20 73 71 6c 69 74 65 5f 65 78 65   when sqlite_exe
05a0: 63 28 29 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  c() is.** invoke
05b0: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 61  d with a NULL ca
05c0: 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 65 72 2e 20  llback pointer. 
05d0: 20 49 66 20 77 65 20 70 61 73 73 20 61 20 4e 55   If we pass a NU
05e0: 4c 4c 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 70  LL callback.** p
05f0: 6f 69 6e 74 65 72 20 69 6e 74 6f 20 73 71 6c 69  ointer into sqli
0600: 74 65 56 64 62 65 45 78 65 63 28 29 20 69 74 20  teVdbeExec() it 
0610: 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 74 20 65  will return at e
0620: 76 65 72 79 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  very OP_Callback
0630: 2c 0a 2a 2a 20 77 68 69 63 68 20 77 65 20 64 6f  ,.** which we do
0640: 20 6e 6f 74 20 77 61 6e 74 20 69 74 20 74 6f 20   not want it to 
0650: 64 6f 2e 20 20 53 6f 20 77 65 20 73 75 62 73 74  do.  So we subst
0660: 69 74 75 74 65 20 61 20 70 6f 69 6e 74 65 72 20  itute a pointer 
0670: 74 6f 20 74 68 69 73 0a 2a 2a 20 70 72 6f 63 65  to this.** proce
0680: 64 75 72 65 20 69 6e 20 70 6c 61 63 65 20 6f 66  dure in place of
0690: 20 74 68 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74   the NULL..*/.st
06a0: 61 74 69 63 20 69 6e 74 20 66 61 6b 65 43 61 6c  atic int fakeCal
06b0: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 4e 6f 74 55  lback(void *NotU
06c0: 73 65 64 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  sed, int n, char
06d0: 20 2a 2a 61 7a 31 2c 20 63 68 61 72 20 2a 2a 61   **az1, char **a
06e0: 7a 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b  z2){.  return 0;
06f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
0700: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
0710: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
0720: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61  SQL statement ha
0730: 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64  s been.** parsed
0740: 20 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 20   and we want to 
0750: 65 78 65 63 75 74 65 20 74 68 65 20 56 44 42 45  execute the VDBE
0760: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
0770: 6e 74 20 0a 2a 2a 20 74 68 61 74 20 73 74 61 74  nt .** that stat
0780: 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61 63  ement.  Prior ac
0790: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73 68  tion routines sh
07a0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
07b0: 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64  y.** constructed
07c0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64 6f   VDBE code to do
07d0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 65   the work of the
07e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
07f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0800: 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78 65 63  just has to exec
0810: 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f 64  ute the VDBE cod
0820: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
0830: 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  at if an error o
0840: 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68  ccurred, it migh
0850: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
0860: 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f  at.** no VDBE co
0870: 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  de was generated
0880: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0890: 45 78 65 63 28 50 61 72 73 65 20 2a 70 50 61 72  Exec(Parse *pPar
08a0: 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  se){.  int rc = 
08b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
08c0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
08d0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
08e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
08f0: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
0900: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
0910: 61 72 2a 2a 2c 63 68 61 72 2a 2a 29 3b 0a 0a 20  ar**,char**);.. 
0920: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
0930: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
0940: 72 6e 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b 20  rn;.  xCallback 
0950: 3d 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  = pParse->xCallb
0960: 61 63 6b 3b 0a 20 20 69 66 28 20 78 43 61 6c 6c  ack;.  if( xCall
0970: 62 61 63 6b 3d 3d 30 20 26 26 20 70 50 61 72 73  back==0 && pPars
0980: 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 20 29  e->useCallback )
0990: 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20 66 61 6b   xCallback = fak
09a0: 65 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 69 66 28  eCallback;.  if(
09b0: 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45   v && pParse->nE
09c0: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c  rr==0 ){.    FIL
09d0: 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e  E *trace = (db->
09e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
09f0: 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73  dbeTrace)!=0 ? s
0a00: 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73  tdout : 0;.    s
0a10: 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28 76  qliteVdbeTrace(v
0a20: 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71  , trace);.    sq
0a30: 6c 69 74 65 56 64 62 65 4d 61 6b 65 52 65 61 64  liteVdbeMakeRead
0a40: 79 28 76 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20  y(v, xCallback, 
0a50: 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 70 50  pParse->pArg, pP
0a60: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
0a70: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
0a80: 75 73 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  useCallback ){. 
0a90: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
0aa0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
0ab0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 56      rc = sqliteV
0ac0: 64 62 65 4c 69 73 74 28 76 29 3b 0a 20 20 20 20  dbeList(v);.    
0ad0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f      db->next_coo
0ae0: 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d  kie = db->aDb[0]
0af0: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  .schema_cookie;.
0b00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
0b10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 45       sqliteVdbeE
0b20: 78 65 63 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  xec(v);.      }.
0b30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
0b40: 65 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 76 2c  eVdbeFinalize(v,
0b50: 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73   &pParse->zErrMs
0b60: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
0b70: 20 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b   ) pParse->nErr+
0b80: 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  +;.      pParse-
0b90: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0ba0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
0bb0: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  c;.      if( rc 
0bc0: 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b  ) pParse->nErr++
0bd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0be0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
0bf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53  pParse->nErr ? S
0c00: 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51  QLITE_ERROR : SQ
0c10: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
0c20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
0c30: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
0c40: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
0c50: 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20 20  Verified = 0;.  
0c60: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65  }else if( pParse
0c70: 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30  ->useCallback==0
0c80: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
0c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
0ca0: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
0cb0: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
0cc0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
0cd0: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
0ce0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67  0;.  pParse->nAg
0cf0: 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
0d00: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
0d10: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
0d20: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
0d30: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  * a particular d
0d40: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67 69  atabase table gi
0d50: 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ven the name.** 
0d60: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20  of that table.  
0d70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
0d80: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62  ot found..*/.Tab
0d90: 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e 64 54 61  le *sqliteFindTa
0da0: 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  ble(sqlite *db, 
0db0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
0dc0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
0dd0: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62  Database){.  Tab
0de0: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  le *p = 0;.  int
0df0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
0e00: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
0e10: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
0e20: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
0e30: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
0e40: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
0e50: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
0e60: 30 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43  0 && sqliteStrIC
0e70: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
0e80: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
0e90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
0ea0: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  p = sqliteHashFi
0eb0: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74  nd(&db->aDb[j].t
0ec0: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  blHash, zName, s
0ed0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
0ee0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
0ef0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
0f00: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
0f10: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
0f20: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
0f30: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
0f40: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
0f50: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
0f60: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a   of that index..
0f70: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
0f80: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
0f90: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e  Index *sqliteFin
0fa0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  dIndex(sqlite *d
0fb0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0fc0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
0fd0: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
0fe0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
0ff0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1000: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1010: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
1020: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
1030: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
1040: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
1050: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 53 74   zDb && sqliteSt
1060: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
1070: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1080: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1090: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
10a0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48  &db->aDb[j].idxH
10b0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
10c0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
10d0: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
10e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
10f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
1100: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
1110: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
1120: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
1130: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
1140: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
1150: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
1160: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1170: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
1180: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
1190: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
11a0: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
11b0: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
11c0: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
11d0: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
11e0: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
11f0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1200: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1210: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
1220: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
1230: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
1240: 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73  dex *pOld;..  as
1250: 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70  sert( db!=0 && p
1260: 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ->zName!=0 );.  
1270: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
1280: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
1290: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
12a0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e        strlen(p->
12d0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
12e0: 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70  if( pOld!=0 && p
12f0: 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73 71  Old!=p ){.    sq
1300: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
1310: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
1320: 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a  idxHash, pOld->z
1330: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
1340: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
1350: 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31  n(pOld->zName)+1
1360: 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 73  , pOld);.  }.  s
1370: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
1380: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
1390: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
13a0: 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  om its table, th
13b0: 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65  en remove.** the
13c0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
13d0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
13e0: 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65   and free its me
13f0: 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72  mory.** structur
1400: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1410: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
1420: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  eIndex(sqlite *d
1430: 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  b, Index *pIndex
1440: 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ){.  if( pIndex-
1450: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
1460: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70  =pIndex ){.    p
1470: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
1480: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
1490: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
14a0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
14b0: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
14c0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
14d0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
14e0: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
14f0: 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20 26  t){}.    if( p &
1500: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
1510: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ex ){.      p->p
1520: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
1530: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1540: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
1550: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
1570: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
1580: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1590: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
15a0: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61  ables of.** data
15b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
15c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
15d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c  s called to recl
15e0: 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65  aim memory.** be
15f0: 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  fore the connect
1600: 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ion closes.  It 
1610: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
1620: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1630: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
1640: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
1650: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
1660: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1670: 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65  f iDb<=0 then re
1680: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
1690: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66   schema tables f
16a0: 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
16b0: 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44  ** files.  If iD
16c0: 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20  b>=2 then reset 
16d0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
16e0: 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65  ema for only the
16f0: 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  .** single file 
1700: 69 6e 64 69 63 61 74 65 73 2e 0a 2a 2f 0a 76 6f  indicates..*/.vo
1710: 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e  id sqliteResetIn
1720: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c  ternalSchema(sql
1730: 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  ite *db, int iDb
1740: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
1750: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d  Elem;.  Hash tem
1760: 70 31 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32  p1;.  Hash temp2
1770: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  ;.  int i, j;.. 
1780: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
1790: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
17a0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
17b0: 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c   ~SQLITE_Initial
17c0: 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44  ized;.  for(i=iD
17d0: 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  b; i<db->nDb; i+
17e0: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
17f0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
1800: 20 20 20 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e     temp1 = pDb->
1810: 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 74 65 6d  tblHash;.    tem
1820: 70 32 20 3d 20 70 44 62 2d 3e 74 72 69 67 48 61  p2 = pDb->trigHa
1830: 73 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61  sh;.    sqliteHa
1840: 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69  shInit(&pDb->tri
1850: 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  gHash, SQLITE_HA
1860: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
1870: 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65     sqliteHashCle
1880: 61 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b  ar(&pDb->aFKey);
1890: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 43  .    sqliteHashC
18a0: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
18b0: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
18c0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
18d0: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
18e0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
18f0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
1900: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a  .      Trigger *
1910: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
1920: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
1930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  ;.      sqliteDe
1940: 6c 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69  leteTrigger(pTri
1950: 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gger);.    }.   
1960: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
1970: 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71  (&temp2);.    sq
1980: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 70 44  liteHashInit(&pD
1990: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49  b->tblHash, SQLI
19a0: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
19b0: 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65  0);.    for(pEle
19c0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
19d0: 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d  t(&temp1); pElem
19e0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
19f0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
1a00: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1a10: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
1a20: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20  ta(pElem);.     
1a30: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
1a40: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
1a50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 48 61    }.    sqliteHa
1a60: 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29 3b  shClear(&temp1);
1a70: 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  .    db->aDb[i].
1a80: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
1a90: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20  _Initialized;.  
1aa0: 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65    if( iDb>0 ) re
1ab0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
1ac0: 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20  rt( iDb==0 );.  
1ad0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
1ae0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
1af0: 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  es;..  /* If one
1b00: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
1b10: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1b20: 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65  se files has bee
1b30: 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74  n closed,.  ** t
1b40: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20  hen remove then 
1b50: 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61  from the auxilia
1b60: 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74  ry database list
1b70: 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20  .  We take the. 
1b80: 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   ** opportunity 
1b90: 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20  to do this here 
1ba0: 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75  since we have ju
1bb0: 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f  st deleted all o
1bc0: 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d  f the.  ** schem
1bd0: 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  a hash tables an
1be0: 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e  d therefore do n
1bf0: 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  ot have to make 
1c00: 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  any changes.  **
1c10: 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   to any of those
1c20: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1c30: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
1c40: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1c50: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
1c60: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
1c70: 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44  qliteFree(db->aD
1c80: 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  b[i].zName);.   
1c90: 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e     db->aDb[i].zN
1ca0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
1cb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1cc0: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
1cd0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 2b 2b 5d      db->aDb[j++]
1ce0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
1cf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65     }.  }.  memse
1d00: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
1d10: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
1d20: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
1d30: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
1d40: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
1d50: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
1d60: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
1d70: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
1d80: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
1d90: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
1da0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
1db0: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
1dc0: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
1dd0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
1de0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1df0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1e00: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72  led whenever a r
1e10: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
1e20: 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a   If there were.*
1e30: 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  * schema changes
1e40: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
1e50: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65  saction, then we
1e60: 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74   have to reset t
1e70: 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68  he.** internal h
1e80: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72  ash tables and r
1e90: 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20  eload them from 
1ea0: 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  disk..*/.void sq
1eb0: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  liteRollbackInte
1ec0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
1ed0: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
1ee0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1ef0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
1f00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73  ){.    sqliteRes
1f10: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
1f20: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
1f30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
1f50: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
1f60: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1f70: 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  eCommitInternalC
1f80: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
1f90: 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  b){.  db->aDb[0]
1fa0: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d  .schema_cookie =
1fb0: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
1fc0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
1fd0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
1fe0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
1ff0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
2000: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
2010: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2020: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
2030: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
2040: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
2050: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
2060: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
2070: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
2080: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
2090: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
20a0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
20b0: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
20c0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
20d0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e  e hash table.  N
20e0: 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76  or does it remov
20f0: 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79  e.** foreign key
2100: 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
2110: 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  e.aFKey hash tab
2120: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
2130: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
2140: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
2150: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
2160: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
2170: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
2180: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * the table..**.
2190: 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63  ** Indices assoc
21a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
21b0: 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65  able are unlinke
21c0: 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a  d from the "db".
21d0: 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ** data structur
21e0: 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20  e if db!=NULL.  
21f0: 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64  If db==NULL, ind
2200: 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f  ices attached to
2210: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72  .** the table ar
2220: 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69  e deleted, but i
2230: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65  t is assumed the
2240: 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  y have already b
2250: 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e  een.** unlinked.
2260: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
2270: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
2280: 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  e *db, Table *pT
2290: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
22a0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
22b0: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
22c0: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
22d0: 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  ey;..  if( pTabl
22e0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  e==0 ) return;..
22f0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
2300: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
2310: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
2320: 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  le.  */.  for(pI
2330: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
2340: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
2350: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
2360: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
2370: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
2380: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62  ert( pIndex->iDb
2390: 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c  ==pTable->iDb ||
23a0: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30   (pTable->iDb==0
23b0: 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d   && pIndex->iDb=
23c0: 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  =1) );.    sqlit
23d0: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
23e0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
23f0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66   /* Delete all f
2400: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
2410: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
2420: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79   table.  The key
2430: 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  s.  ** should ha
2440: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
2450: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
2460: 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68  e db->aFKey hash
2470: 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66   table .  */.  f
2480: 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d  or(pFKey=pTable-
2490: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
24a0: 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b  FKey=pNextFKey){
24b0: 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d  .    pNextFKey =
24c0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
24d0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
24e0: 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e  Table->iDb<db->n
24f0: 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
2500: 28 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64  ( sqliteHashFind
2510: 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65  (&db->aDb[pTable
2520: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20  ->iDb].aFKey,.  
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
2550: 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65  zTo, strlen(pFKe
2560: 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65  y->zTo)+1)!=pFKe
2570: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  y );.    sqliteF
2580: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  ree(pFKey);.  }.
2590: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
25a0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
25b0: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
25c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
25d0: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
25e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
25f0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  able->aCol[i].zN
2600: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
2610: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
2620: 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20  l[i].zDflt);.   
2630: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2640: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  le->aCol[i].zTyp
2650: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
2660: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
2670: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
2680: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
2690: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
26a0: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
26b0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
26c0: 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a  Free(pTable);.}.
26d0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
26e0: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
26f0: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
2700: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
2710: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
2720: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
2730: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
2740: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
2750: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2760: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
2770: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
2780: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
2790: 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a  .  Table *pOld;.
27a0: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
27b0: 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  2;.  int i = p->
27c0: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  iDb;.  assert( d
27d0: 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d  b!=0 );.  pOld =
27e0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
27f0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62  t(&db->aDb[i].tb
2800: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
2810: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
2820: 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  )+1, 0);.  asser
2830: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
2840: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70  ld==p );.  for(p
2850: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
2860: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
2870: 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e  From){.    int n
2880: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d  To = strlen(pF1-
2890: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70  >zTo) + 1;.    p
28a0: 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46  F2 = sqliteHashF
28b0: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ind(&db->aDb[i].
28c0: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
28d0: 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70   nTo);.    if( p
28e0: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
28f0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
2900: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46  t(&db->aDb[i].aF
2910: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
2920: 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  To, pF1->pNextTo
2930: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2940: 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26      while( pF2 &
2950: 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d  & pF2->pNextTo!=
2960: 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e  pF1 ){ pF2=pF2->
2970: 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20  pNextTo; }.     
2980: 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20   if( pF2 ){.    
2990: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
29a0: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
29b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29c0: 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74   }.  sqliteDelet
29d0: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d  eTable(db, p);.}
29e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
29f0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2a00: 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e  user table or in
2a10: 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e  dex from a token
2a20: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
2a30: 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69   hold the name i
2a40: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2a50: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
2a60: 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72  nd must.** be fr
2a70: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
2a80: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
2a90: 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c  char *sqliteTabl
2aa0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  eNameFromToken(T
2ab0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
2ac0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
2ad0: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
2ae0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
2af0: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
2b00: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
2b10: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
2b20: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2b30: 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72  to open the appr
2b40: 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72 20 74  opriate master t
2b50: 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65  able.  The table
2b60: 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  .** opened will 
2b70: 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  be SQLITE_MASTER
2b80: 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
2b90: 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53  tables and .** S
2ba0: 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45  QLITE_TEMP_MASTE
2bb0: 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  R for temporary 
2bc0: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62  tables.  The tab
2bd0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  le is opened.** 
2be0: 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  on cursor 0..*/.
2bf0: 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d  void sqliteOpenM
2c00: 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65 20  asterTable(Vdbe 
2c10: 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b  *v, int isTemp){
2c20: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
2c30: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
2c40: 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20 20  , isTemp, 0);.  
2c50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2c60: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
2c70: 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 2);.}../*.**
2c80: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
2c90: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
2ca0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2cb0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
2cc0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
2cd0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
2ce0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
2cf0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
2d00: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
2d10: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2d20: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
2d30: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
2d40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
2d50: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
2d60: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
2d70: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
2d80: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
2d90: 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b  he.** pStart tok
2da0: 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45  en is the CREATE
2db0: 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68   and pName is th
2dc0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
2dd0: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
2de0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
2df0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
2e00: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
2e10: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2e20: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
2e30: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
2e40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2e50: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
2e60: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
2e70: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
2e80: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
2e90: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
2ea0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
2eb0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
2ec0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
2ed0: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
2ee0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
2ef0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
2f00: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
2f10: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
2f20: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
2f30: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
2f40: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
2f50: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
2f60: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
2f70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
2f80: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
2f90: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
2fa0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
2fb0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
2fc0: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72  liteEndTable() r
2fd0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
2fe0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
2ff0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
3000: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
3010: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
3020: 64 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62  d sqliteStartTab
3030: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
3040: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
3050: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
3060: 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f  ken *pStart,   /
3070: 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74  * The "CREATE" t
3080: 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  oken */.  Token 
3090: 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  *pName,    /* Na
30a0: 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 76  me of table or v
30b0: 69 65 77 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  iew to create */
30c0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
30d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
30e0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
30f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
3100: 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75  iew       /* Tru
3110: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
3120: 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  IEW */.){.  Tabl
3130: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64  e *pTable;.  Ind
3140: 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72  ex *pIdx;.  char
3150: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
3160: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
3170: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
3180: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70 50 61   int iDb;..  pPa
3190: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
31a0: 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e   = *pStart;.  zN
31b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
31c0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
31d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
31e0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
31f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 44    if( pParse->iD
3200: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
3210: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
3220: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
3230: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
3240: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
3250: 65 6d 70 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  emp );.  if( sql
3260: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
3270: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
3280: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
3290: 28 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a  (isTemp), 0) ){.
32a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
32b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
32c0: 6e 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 69  n;.  }.  {.    i
32d0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  nt code;.    if(
32e0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
32f0: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
3300: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
3310: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
3320: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
3330: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
3340: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
3350: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
3360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3370: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
3380: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
3390: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
33a0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
33b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
33c0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
33d0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
33e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
33f0: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
3400: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
3410: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
3420: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3430: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
3440: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
3450: 0a 20 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  . ..  /* Before 
3460: 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65  trying to create
3470: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
3480: 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  le, make sure th
3490: 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a  e Btree for.  **
34a0: 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61   holding tempora
34b0: 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65  ry tables is ope
34c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  n..  */.  if( is
34d0: 54 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b  Temp && db->aDb[
34e0: 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
34f0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
3500: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
3510: 6c 69 74 65 42 74 72 65 65 46 61 63 74 6f 72 79  liteBtreeFactory
3520: 28 64 62 2c 20 22 3a 74 65 6d 70 3a 22 2c 20 30  (db, ":temp:", 0
3530: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
3540: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
3550: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
3560: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
3570: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
3580: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
3590: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
35a0: 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
35b0: 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
35c0: 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
35d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
35e0: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  s", 0);.      pP
35f0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3600: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3610: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  }.    if( db->fl
3620: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
3630: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63  rans ){.      rc
3640: 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 42 65   = sqliteBtreeBe
3650: 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62  ginTrans(db->aDb
3660: 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20  [1].pBt);.      
3670: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3680: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
3690: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
36a0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
36b0: 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
36c0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
36d0: 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
36e0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
36f0: 73 65 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20  se file", 0);.  
3700: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3710: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
3720: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
3730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
3740: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
3750: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
3760: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
3770: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
3780: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
3790: 20 6e 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e   name.  Issue an
37a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
37b0: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a  f it does..  **.
37c0: 20 20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72    ** If we are r
37d0: 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e-reading the sq
37e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
37f0: 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 73  e because of a s
3800: 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67  chema.  ** chang
3810: 65 20 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d  e and a new perm
3820: 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66  anent table is f
3830: 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20  ound whose name 
3840: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20  collides with.  
3850: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  ** an existing t
3860: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
3870: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  that is not an e
3880: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  rror..  */.  pTa
3890: 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ble = sqliteFind
38a0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
38b0: 20 30 29 3b 0a 20 20 69 44 62 20 3d 20 69 73 54   0);.  iDb = isT
38c0: 65 6d 70 20 3f 20 31 20 3a 20 70 50 61 72 73 65  emp ? 1 : pParse
38d0: 2d 3e 69 44 62 3b 0a 20 20 69 66 28 20 70 54 61  ->iDb;.  if( pTa
38e0: 62 6c 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c  ble!=0 && (pTabl
38f0: 65 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21  e->iDb==iDb || !
3900: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
3910: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  ) ){.    sqliteS
3920: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
3930: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
3940: 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e  le ", 0, pName->
3950: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20  z, pName->n,.   
3960: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
3970: 78 69 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20  xists", 0, 0);. 
3980: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3990: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ame);.    pParse
39a0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
39b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
39c0: 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69  (pIdx = sqliteFi
39d0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
39e0: 65 2c 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20  e, 0))!=0 &&.   
39f0: 20 20 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44         (pIdx->iD
3a00: 62 3d 3d 30 20 7c 7c 20 21 70 50 61 72 73 65 2d  b==0 || !pParse-
3a10: 3e 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20  >initFlag) ){.  
3a20: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3a30: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3a40: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
3a50: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
3a60: 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20  amed ", .       
3a70: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
3a80: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
3a90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
3aa0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
3ab0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
3ac0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
3ad0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
3ae0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3af0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
3b00: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
3b10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
3b20: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
3b30: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
3b40: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
3b50: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
3b60: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
3b70: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
3b80: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
3b90: 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66  >iDb = iDb;.  if
3ba0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
3bb0: 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c 65  ble ) sqliteDele
3bc0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72  teTable(db, pPar
3bd0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a  se->pNewTable);.
3be0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
3bf0: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
3c00: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
3c10: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
3c20: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
3c30: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
3c40: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
3c50: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
3c60: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
3c70: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
3c80: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
3c90: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
3ca0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
3cb0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
3cc0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
3cd0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
3ce0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
3cf0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
3d00: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
3d10: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
3d20: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
3d30: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
3d40: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
3d50: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
3d60: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
3d70: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
3d80: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
3d90: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
3da0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
3db0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
3dc0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69  if( !pParse->ini
3dd0: 74 46 6c 61 67 20 26 26 20 28 76 20 3d 20 73 71  tFlag && (v = sq
3de0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
3df0: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  se))!=0 ){.    s
3e00: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
3e10: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
3e20: 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20   0, isTemp);.   
3e30: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
3e40: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3e50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
3e60: 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f  ger, db->file_fo
3e70: 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rmat, 0);.      
3e80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3e90: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
3ea0: 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
3eb0: 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74    sqliteOpenMast
3ec0: 65 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65 6d  erTable(v, isTem
3ed0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  p);.    sqliteVd
3ee0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
3ef0: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
3f00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f10: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
3f20: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
3f30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3f40: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
3f50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3f60: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
3f70: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  y, 0, 0);.  }.}.
3f80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
3f90: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
3fa0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
3fb0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
3fc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
3fd0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
3fe0: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
3ff0: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
4000: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
4010: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4020: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 53 74  ement.  sqliteSt
4030: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
4040: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
4050: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
4060: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
4070: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4080: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
4090: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
40a0: 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61  liteAddColumn(Pa
40b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
40c0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
40d0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
40e0: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  .  char *z = 0;.
40f0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
4100: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
4110: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
4120: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
4130: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  iteSetNString(&z
4140: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
4150: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20  e->n, 0);.  if( 
4160: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
4170: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
4180: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4190: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
41a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
41b0: 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  ICmp(z, p->aCol[
41c0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
41d0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
41e0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
41f0: 45 72 72 4d 73 67 2c 20 22 64 75 70 6c 69 63 61  ErrMsg, "duplica
4200: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
4210: 22 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20  ", z, 0);.      
4220: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
4240: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
4250: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
4260: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
4270: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
4280: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
4290: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
42a0: 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70  loc( p->aCol, (p
42b0: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
42c0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
42d0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
42e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e   return;.    p->
42f0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
4300: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
4310: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
4320: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
4330: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
4340: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
4350: 65 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73  e = z;.  pCol->s
4360: 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
4370: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e  E_SO_NUM;.  p->n
4380: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
4390: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
43a0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
43b0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
43c0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
43d0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
43e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
43f0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
4400: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
4410: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
4420: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
4430: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
4440: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
4450: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
4460: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
4470: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
4480: 69 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e  id sqliteAddNotN
4490: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
44a0: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
44b0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
44c0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
44d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
44e0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
44f0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
4500: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
4510: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
4520: 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  l = onError;.}..
4530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4540: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4550: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
4560: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
4570: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
4580: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4590: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
45a0: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
45b0: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
45c0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
45d0: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
45e0: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
45f0: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
4600: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4610: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
4620: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
4630: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
4640: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
4650: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
4660: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
4670: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
4680: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
4690: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
46a0: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
46b0: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
46c0: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
46d0: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e   sqliteAddColumn
46e0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
46f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73  se, Token *pFirs
4700: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29  t, Token *pLast)
4710: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4720: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
4730: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a  n;.  char *z, **
4740: 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pz;.  Column *pC
4750: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
4760: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4770: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
4780: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
4790: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
47a0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
47b0: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d  >aCol[i];.  pz =
47c0: 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20   &pCol->zType;. 
47d0: 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20   n = pLast->n + 
47e0: 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d  Addr(pLast->z) -
47f0: 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29   Addr(pFirst->z)
4800: 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74  ;.  sqliteSetNSt
4810: 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d  ring(pz, pFirst-
4820: 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d  >z, n, 0);.  z =
4830: 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30   *pz;.  if( z==0
4840: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4850: 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  (i=j=0; z[i]; i+
4860: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  +){.    int c = 
4870: 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  z[i];.    if( is
4880: 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69  space(c) ) conti
4890: 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20  nue;.    z[j++] 
48a0: 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  = c;.  }.  z[j] 
48b0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73  = 0;.  if( pPars
48c0: 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e->db->file_form
48d0: 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 70 43 6f  at>=4 ){.    pCo
48e0: 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  l->sortOrder = s
48f0: 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70 65  qliteCollateType
4900: 28 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  (z, n);.  }else{
4910: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f  .    pCol->sortO
4920: 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f  rder = SQLITE_SO
4930: 5f 4e 55 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  _NUM;.  }.}../*.
4940: 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b  ** The given tok
4950: 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  en is the defaul
4960: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
4970: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
4980: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
4990: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
49a0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
49b0: 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20   If "minusFlag" 
49c0: 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d  is true, it.** m
49d0: 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  eans the value t
49e0: 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65  oken was precede
49f0: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
4a00: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
4a10: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4a20: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
4a30: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
4a40: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
4a50: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4a60: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
4a70: 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61 75  d sqliteAddDefau
4a80: 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ltValue(Parse *p
4a90: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56  Parse, Token *pV
4aa0: 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61  al, int minusFla
4ab0: 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  g){.  Table *p;.
4ac0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
4ad0: 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d  **pz;.  if( (p =
4ae0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4af0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
4b00: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
4b10: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
4b20: 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d  turn;.  pz = &p-
4b30: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a  >aCol[i].zDflt;.
4b40: 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20    if( minusFlag 
4b50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
4b60: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c  NString(pz, "-",
4b70: 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61   1, pVal->z, pVa
4b80: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  l->n, 0);.  }els
4b90: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e{.    sqliteSet
4ba0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c  NString(pz, pVal
4bb0: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
4bc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65  ;.  }.  sqliteDe
4bd0: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f  quote(*pz);.}../
4be0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
4bf0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
4c00: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
4c10: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
4c20: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
4c30: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
4c40: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
4c50: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
4c60: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
4c70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
4c80: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
4c90: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
4ca0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
4cb0: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
4cc0: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
4cd0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
4ce0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
4cf0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
4d00: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
4d10: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
4d20: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
4d30: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
4d40: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
4d50: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
4d60: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
4d70: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
4d80: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
4d90: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
4da0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
4db0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
4dc0: 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f  w id.  (Exceptio
4dd0: 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61  n:.** For backwa
4de0: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
4df0: 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74  y with older dat
4e00: 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64  abases, do not d
4e10: 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65  o this.** if the
4e20: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72   file format ver
4e30: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c  sion number is l
4e40: 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65  ess than 1.)  Se
4e50: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
4e60: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
4e70: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
4e80: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
4e90: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
4ea0: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
4eb0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
4ec0: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
4ed0: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
4ee0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
4ef0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4f00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
4f10: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
4f20: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4f30: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
4f40: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
4f50: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
4f60: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
4f70: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
4f80: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
4f90: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 50 72 69  oid sqliteAddPri
4fa0: 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70  maryKey(Parse *p
4fb0: 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70  Parse, IdList *p
4fc0: 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  List, int onErro
4fd0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
4fe0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
4ff0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
5000: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
5010: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28  iCol = -1;.  if(
5020: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
5030: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
5040: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61  ;.  if( pTab->ha
5050: 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20  sPrimKey ){.    
5060: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
5070: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
5080: 2c 20 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54  , "table \"", pT
5090: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
50a0: 20 20 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65      "\" has more
50b0: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
50c0: 79 20 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20  y key", 0);.    
50d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
50e0: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
50f0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
5100: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
5110: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69  y = 1;.  if( pLi
5120: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
5130: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
5140: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
5150: 70 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b  pList->nId==1 ){
5160: 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
5170: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
5180: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
5190: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
51a0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a  mp(pList->a[0].z
51b0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
51c0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
51d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
51e0: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
51f0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
5200: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
5210: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
5220: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
5230: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
5240: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31  ->file_format>=1
5250: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20   && .           
5260: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 53  zType && sqliteS
5270: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
5280: 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20  NTEGER")==0 ){. 
5290: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
52a0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
52b0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
52c0: 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  or;.  }else{.   
52d0: 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64   sqliteCreateInd
52e0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
52f0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
5300: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
5310: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
5320: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
5330: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
5340: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
5350: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
5360: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
5370: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
5380: 67 20 74 79 70 65 20 67 69 76 65 6e 20 61 20 74  g type given a t
5390: 79 70 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ype name..**.** 
53a0: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79  The collation ty
53b0: 70 65 20 69 73 20 74 65 78 74 20 28 53 51 4c 49  pe is text (SQLI
53c0: 54 45 5f 53 4f 5f 54 45 58 54 29 20 69 66 20 74  TE_SO_TEXT) if t
53d0: 68 65 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20  he type.** name 
53e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 68 61  contains the cha
53f0: 72 61 63 74 65 72 20 73 74 72 65 61 6d 20 22 74  racter stream "t
5400: 65 78 74 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f  ext" or "blob" o
5410: 72 0a 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e  r.** "clob".  An
5420: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6e 61 6d  y other type nam
5430: 65 20 69 73 20 63 6f 6c 6c 61 74 65 64 20 61 73  e is collated as
5440: 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c   numeric.** (SQL
5450: 49 54 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a  ITE_SO_NUM)..*/.
5460: 69 6e 74 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74  int sqliteCollat
5470: 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  eType(const char
5480: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
5490: 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pe){.  int i;.  
54a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65  for(i=0; i<nType
54b0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77  -1; i++){.    sw
54c0: 69 74 63 68 28 20 7a 54 79 70 65 5b 69 5d 20 29  itch( zType[i] )
54d0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 62 27  {.      case 'b'
54e0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 42 27  :.      case 'B'
54f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5500: 69 3c 6e 54 79 70 65 2d 33 20 26 26 20 73 71 6c  i<nType-3 && sql
5510: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79  iteStrNICmp(&zTy
5520: 70 65 5b 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d  pe[i],"blob",4)=
5530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
5550: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d  _TEXT;.        }
5560: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
5580: 73 65 20 27 63 27 3a 0a 20 20 20 20 20 20 63 61  se 'c':.      ca
5590: 73 65 20 27 43 27 3a 20 7b 0a 20 20 20 20 20 20  se 'C': {.      
55a0: 20 20 69 66 28 20 69 3c 6e 54 79 70 65 2d 33 20    if( i<nType-3 
55b0: 26 26 20 28 73 71 6c 69 74 65 53 74 72 4e 49 43  && (sqliteStrNIC
55c0: 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 68  mp(&zType[i],"ch
55d0: 61 72 22 2c 34 29 3d 3d 30 20 7c 7c 0a 20 20 20  ar",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 20 20 20 73 71 6c 69 74 65 53 74          sqliteSt
5600: 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d  rNICmp(&zType[i]
5610: 2c 22 63 6c 6f 62 22 2c 34 29 3d 3d 30 29 0a 20  ,"clob",4)==0). 
5620: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
5630: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5640: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20  E_SO_TEXT;.     
5650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
5660: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5670: 20 20 63 61 73 65 20 27 78 27 3a 0a 20 20 20 20    case 'x':.    
5680: 20 20 63 61 73 65 20 27 58 27 3a 20 7b 0a 20 20    case 'X': {.  
5690: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 32 20 26        if( i>=2 &
56a0: 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  & sqliteStrNICmp
56b0: 28 26 7a 54 79 70 65 5b 69 2d 32 5d 2c 22 74 65  (&zType[i-2],"te
56c0: 78 74 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20  xt",4)==0 ){.   
56d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
56e0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
56f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5700: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5710: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5720: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5740: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5750: 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a  _SO_NUM;.}../*.*
5760: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5770: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
5780: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
5790: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
57a0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
57b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
57c0: 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20  t.  A "COLLATE" 
57d0: 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65  clause has.** be
57e0: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
57f0: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
5800: 6e 65 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75  ne sets the Colu
5810: 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a  mn.sortOrder on.
5820: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
5830: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
5840: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5850: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
5860: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
5870: 70 50 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c  pParse, int coll
5880: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
5890: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
58a0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
58b0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
58c0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
58d0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
58e0: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
58f0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c  sortOrder = coll
5900: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Type;.}../*.** C
5910: 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65  ome up with a ne
5920: 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66  w random value f
5930: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  or the schema co
5940: 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  okie.  Make sure
5950: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75  .** the new valu
5960: 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  e is different f
5970: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a  rom the old..**.
5980: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
5990: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
59a0: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
59b0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
59c0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
59d0: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
59e0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
59f0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
5a00: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
5a10: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
5a20: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
5a30: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
5a40: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
5a50: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
5a60: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
5a70: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
5a80: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
5a90: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
5aa0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
5ab0: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
5ac0: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
5ad0: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
5ae0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
5af0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
5b00: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
5b10: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
5b20: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
5b30: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
5b40: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
5b50: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
5b60: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
5b70: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
5b80: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
5b90: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
5ba0: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
5bb0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
5bc0: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
5bd0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
5be0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
5bf0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
5c00: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
5c10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68  */.void sqliteCh
5c20: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
5c30: 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b  e *db, Vdbe *v){
5c40: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f  .  if( db->next_
5c50: 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b  cookie==db->aDb[
5c60: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
5c70: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74   ){.    db->next
5c80: 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44  _cookie = db->aD
5c90: 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  b[0].schema_cook
5ca0: 69 65 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f  ie + sqliteRando
5cb0: 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20  mByte() + 1;.   
5cc0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
5cd0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
5ce0: 65 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  es;.    sqliteVd
5cf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5d00: 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f  teger, db->next_
5d10: 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  cookie, 0);.    
5d20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5d30: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
5d40: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
5d50: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
5d60: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
5d70: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
5d80: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
5d90: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
5da0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
5db0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
5dc0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
5dd0: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
5de0: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
5df0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
5e00: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
5e10: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
5e20: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
5e30: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  int needQuote = 
5e40: 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  0;.  for(n=0; *z
5e50: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
5e60: 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b   if( *z=='\'' ){
5e70: 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d   n++; needQuote=
5e80: 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  1; }.  }.  retur
5e90: 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a  n n + needQuote*
5ea0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  2;.}../*.** Writ
5eb0: 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  e an identifier 
5ec0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
5ed0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
5ee0: 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20  .  Add.** quote 
5ef0: 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65  characters as ne
5f00: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
5f10: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
5f20: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
5f30: 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b  , char *zIdent){
5f40: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
5f50: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
5f60: 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  Idx;.  for(j=0; 
5f70: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
5f80: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
5f90: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
5fa0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
5fb0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
5fc0: 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e  edQuote =  zIden
5fd0: 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67  t[j]!=0 || isdig
5fe0: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 7c 7c 20 73 71 6c 69 74 65 4b 65 79 77 6f 72 64  || sqliteKeyword
6010: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
6020: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
6030: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
6040: 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a   = '\'';.  for(j
6050: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
6060: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
6070: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
6080: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
6090: 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  '\'' ) z[i++] = 
60a0: 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20  '\'';.  }.  if( 
60b0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
60c0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69  +] = '\'';.  z[i
60d0: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
60e0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
60f0: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
6100: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
6110: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
6120: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
6130: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
6140: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
6150: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
6160: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
6170: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
6180: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
6190: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
61a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
61b0: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
61c0: 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65  eTableStmt(Table
61d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
61e0: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
61f0: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
6200: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
6210: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
6220: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
6230: 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  i++){.    n += i
6240: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43  dentLength(p->aC
6250: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
6260: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
6270: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
6280: 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20    if( n<40 ){.  
6290: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
62a0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
62b0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
62c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
62d0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
62e0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
62f0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
6300: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
6310: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
6320: 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
6330: 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66  ocRaw( n );.  if
6340: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
6350: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
6360: 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31  zStmt, p->iDb==1
6370: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
6380: 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54  TABLE " : "CREAT
6390: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
63a0: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b  = strlen(zStmt);
63b0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
63c0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
63d0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
63e0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '(';.  for(i=0;
63f0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
6400: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
6410: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
6420: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
6430: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
6440: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
6450: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
6460: 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   &k, p->aCol[i].
6470: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74  zName);.  }.  st
6480: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
6490: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
64a0: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
64b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
64c0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
64d0: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
64e0: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
64f0: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
6500: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
6510: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
6520: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
6530: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
6540: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
6550: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
6560: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
6570: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
6580: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
6590: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
65a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
65b0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
65c0: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
65d0: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
65e0: 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68  sk,.** unless th
65f0: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
6600: 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46  y table or initF
6610: 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e  lag==1.  When in
6620: 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74  itFlag==1,.** it
6630: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
6640: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
6650: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
6660: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
6670: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
6680: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
6690: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
66a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
66b0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
66c0: 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e  anges, so the en
66d0: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
66e0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
66f0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
6700: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
6710: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
6720: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
6730: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
6740: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
6750: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
6760: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
6770: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
6780: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
6790: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
67a0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
67b0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
67c0: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
67d0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
67e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
67f0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
6800: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
6810: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
6820: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
6830: 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  id sqliteEndTabl
6840: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6850: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
6860: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6870: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
6880: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
6890: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
68a0: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
68b0: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
68c0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
68d0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
68e0: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
68f0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
6900: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
6910: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  turn;..  /* If t
6920: 68 65 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65  he table is gene
6930: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c  rated from a SEL
6940: 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72  ECT, then constr
6950: 75 63 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  uct the.  ** lis
6960: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  t of columns and
6970: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
6980: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
6990: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
69a0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
69b0: 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53   = sqliteResultS
69c0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
69d0: 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e, 0, pSelect);.
69e0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
69f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
6a00: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
6a10: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43  ==0 );.    p->nC
6a20: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
6a30: 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  ol;.    p->aCol 
6a40: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
6a50: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
6a60: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
6a70: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
6a80: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
6a90: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
6aa0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6ab0: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
6ac0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
6ad0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
6ae0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
6af0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
6b00: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
6b10: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
6b20: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
6b30: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
6b40: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
6b50: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
6b60: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
6b70: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
6b80: 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73  e from the pPars
6b90: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
6ba0: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
6bb0: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
6bc0: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
6bd0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
6be0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
6bf0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
6c00: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
6c10: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70  .    p->tnum = p
6c20: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a  Parse->newTnum;.
6c30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
6c40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
6c50: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
6c60: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
6c70: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
6c80: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
6c90: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
6ca0: 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f  abase.  The reco
6cb0: 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  rd number.  ** f
6cc0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
6cd0: 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c   entry should al
6ce0: 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20  ready be on the 
6cf0: 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
6d00: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
6d10: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
6d20: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
6d30: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
6d40: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
6d50: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
6d60: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
6d70: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
6d80: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
6d90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
6da0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20     Vdbe *v;..   
6db0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
6dc0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
6dd0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
6de0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  n;.    if( p->pS
6df0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
6e00: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
6e10: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  able */.      sq
6e20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6e30: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
6e40: 20 30 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20   0, p->iDb);.   
6e50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6e60: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP3(v, -1, (ch
6e70: 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50  ar *)&p->tnum, P
6e80: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
6e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
6ea0: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
6eb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6ec0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
6ed0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
6ee0: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  p->tnum = 0;.   
6ef0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6f00: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
6f10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
6f20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
6f30: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
6f40: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
6f50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6f60: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6f70: 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50  , -1, "table", P
6f80: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
6f90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
6fa0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6fb0: 2c 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33  , -1, "view", P3
6fc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
6fd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6fe0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
6ff0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
7000: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
7010: 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  v, -1, p->zName,
7020: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
7030: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7040: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
7050: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7060: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7070: 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33  -1, p->zName, P3
7080: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
7090: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
70a0: 20 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a   OP_Dup, 4, 0);.
70b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
70c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
70d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
70e0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
70f0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61    char *z = crea
7100: 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a  teTableStmt(p);.
7110: 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74        n = z ? st
7120: 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20  rlen(z) : 0;.   
7130: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
7140: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20  ngeP3(v, -1, z, 
7150: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
7160: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c  Free(z);.    }el
7170: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
7180: 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20  ( pEnd!=0 );.   
7190: 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
71a0: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72  ->z) - Addr(pPar
71b0: 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e  se->sFirstToken.
71c0: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71  z) + 1;.      sq
71d0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
71e0: 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
71f0: 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e  sFirstToken.z, n
7200: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7210: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7220: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
7230: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7240: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7250: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
7260: 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44  ;.    if( !p->iD
7270: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
7280: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
7290: 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , v);.    }.    
72a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
72b0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
72c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  0);.    if( pSel
72d0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
72e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
72f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69  OP_Integer, p->i
7300: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
7310: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7320: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
7330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
7340: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
7350: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
7360: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
7370: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20  , SRT_Table, 1, 
7380: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
7390: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
73a0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
73b0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  se);.  }..  /* A
73c0: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
73d0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
73e0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
73f0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
7400: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
7410: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70  >explain==0 && p
7420: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
7430: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
7440: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
7450: 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ey;.    pOld = s
7460: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
7470: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
7480: 2e 74 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20  .tblHash, .     
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c         p->zName,
74b0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
74c0: 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  )+1, p);.    if(
74d0: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
74e0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
74f0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
7500: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
7510: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
7520: 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  ) */.      retur
7530: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  n;.    }.    for
7540: 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b  (pFKey=p->pFKey;
7550: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46   pFKey; pFKey=pF
7560: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  Key->pNextFrom){
7570: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
7580: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
7590: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
75a0: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
75b0: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
75c0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
75d0: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
75e0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
75f0: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
7600: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
7610: 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  .aFKey, pFKey->z
7620: 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b  To, nTo, pFKey);
7630: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
7640: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
7650: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
7660: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
7670: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
7680: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
7690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
76a0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
76b0: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
76c0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
76d0: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
76e0: 74 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  teCreateView(.  
76f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7700: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
7710: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
7720: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
7730: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
7740: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
7750: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
7760: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
7770: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e,      /* The t
7780: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
7790: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
77a0: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
77b0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
77c0: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
77d0: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
77e0: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
77f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
7800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
7810: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
7820: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
7830: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
7840: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7850: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
7860: 0a 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
7870: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67  ble(pParse, pBeg
7880: 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d  in, pName, isTem
7890: 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61  p, 1);.  p = pPa
78a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
78b0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
78c0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
78d0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
78e0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
78f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
7900: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
7910: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
7920: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
7930: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
7940: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
7950: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
7960: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
7970: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
7980: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
7990: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
79a0: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
79b0: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
79c0: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
79d0: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
79e0: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
79f0: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
7a00: 65 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  e_exec() call re
7a10: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
7a20: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7a30: 65 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  eSelectDup(pSele
7a40: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c  ct);.  sqliteSel
7a50: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
7a60: 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  t);.  if( !pPars
7a70: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
7a80: 20 20 20 73 71 6c 69 74 65 56 69 65 77 47 65 74     sqliteViewGet
7a90: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
7aa0: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
7ab0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
7ac0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
7ad0: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
7ae0: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
7af0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
7b00: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
7b10: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
7b20: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
7b30: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
7b40: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
7b50: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
7b60: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
7b70: 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73  0;.  n = ((int)s
7b80: 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42  End.z) - (int)pB
7b90: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70  egin->z;.  z = p
7ba0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
7bb0: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
7bc0: 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63  ]==';' || isspac
7bd0: 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d  e(z[n-1])) ){ n-
7be0: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
7bf0: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
7c00: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
7c10: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
7c20: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
7c30: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
7c40: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
7c50: 20 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65    sqliteEndTable
7c60: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
7c70: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
7c80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
7c90: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
7ca0: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
7cb0: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
7cc0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
7cd0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
7ce0: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
7cf0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
7d00: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
7d10: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
7d20: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
7d30: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
7d40: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
7d50: 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  are->zErrMsg..*/
7d60: 0a 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47  .int sqliteViewG
7d70: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
7d80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
7d90: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45  le *pTable){.  E
7da0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
7db0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
7dc0: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
7dd0: 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  b;.  int nErr = 
7de0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  0;..  assert( pT
7df0: 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  able );..  /* A 
7e00: 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65  positive nCol me
7e10: 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ans the columns 
7e20: 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76  names for this v
7e30: 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72  iew are.  ** alr
7e40: 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f  eady known..  */
7e50: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
7e60: 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Col>0 ) return 0
7e70: 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69  ;..  /* A negati
7e80: 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65  ve nCol is a spe
7e90: 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e  cial marker mean
7ea0: 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20  ing that we are 
7eb0: 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74  currently.  ** t
7ec0: 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65  rying to compute
7ed0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
7ee0: 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20  s.  If we enter 
7ef0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
7f00: 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76  h.  ** a negativ
7f10: 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73  e nCol, it means
7f20: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65   two or more vie
7f30: 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20  ws form a loop, 
7f40: 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
7f50: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
7f60: 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45  VIEW one AS SELE
7f70: 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20  CT * FROM two;. 
7f80: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
7f90: 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43  IEW two AS SELEC
7fa0: 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20  T * FROM one;.  
7fb0: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
7fc0: 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20  , this error is 
7fd0: 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c  caught previousl
7fe0: 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c  y and so the fol
7ff0: 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a  lowing test.  **
8000: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66   should always f
8010: 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ail.  But we wil
8020: 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c  l leave it in pl
8030: 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73  ace just to be s
8040: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  afe..  */.  if( 
8050: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
8060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
8070: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
8080: 45 72 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c  ErrMsg, "view ",
8090: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
80a0: 20 20 20 20 20 20 20 20 20 22 20 69 73 20 63 69           " is ci
80b0: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
80c0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
80d0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
80e0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
80f0: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
8100: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
8110: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
8120: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
8130: 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
8140: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
8150: 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c  ct ); /* If nCol
8160: 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65  ==0, then pTable
8170: 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20   must be a VIEW 
8180: 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62  */.  pSel = pTab
8190: 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  le->pSelect;..  
81a0: 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  /* Note that the
81b0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52   call to sqliteR
81c0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
81d0: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
81e0: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
81f0: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
8200: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
8210: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
8220: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
8230: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
8240: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
8250: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
8260: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
8270: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
8280: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
8290: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
82a0: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
82b0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
82c0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
82d0: 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70  pEList);.  if( p
82e0: 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29  Sel->pEList==0 )
82f0: 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69  {.    pSel->pELi
8300: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  st = pEList;.   
8310: 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d   return 1;  /* M
8320: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
8330: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43    }.  pTable->nC
8340: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54  ol = -1;.  pSelT
8350: 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c  ab = sqliteResul
8360: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
8370: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
8380: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
8390: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
83a0: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
83b0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
83c0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
83d0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
83e0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
83f0: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
8400: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
8410: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
8420: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
8430: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
8440: 62 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  b);.    pParse->
8450: 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e  db->aDb[pTable->
8460: 69 44 62 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 51  iDb].flags |= SQ
8470: 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77  LITE_UnresetView
8480: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
8490: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
84a0: 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  ;.    nErr++;.  
84b0: 7d 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  }.  sqliteSelect
84c0: 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20  Unbind(pSel);.  
84d0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
84e0: 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73  lete(pSel->pELis
84f0: 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  t);.  pSel->pELi
8500: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72  st = pEList;.  r
8510: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
8520: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
8530: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
8540: 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62  om the VIEW pTab
8550: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
8560: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8570: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74   whenever any ot
8580: 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65  her table or vie
8590: 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  w is modified..*
85a0: 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65  * The view passe
85b0: 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
85c0: 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64  ine might depend
85d0: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
85e0: 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68  irectly.** on th
85f0: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65  e modified or de
8600: 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77  leted table so w
8610: 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20  e need to clear 
8620: 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a  the old column.*
8630: 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20  * names so that 
8640: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63  they will be rec
8650: 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
8660: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
8670: 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ewResetColumnNam
8680: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
8690: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
86a0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ( pTable==0 || p
86b0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d  Table->pSelect==
86c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
86d0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
86e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
86f0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
8700: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
8710: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
8720: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  le->aCol[i].zNam
8730: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
8740: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
8750: 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73  i].zDflt);.    s
8760: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
8770: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29  ->aCol[i].zType)
8780: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
8790: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  ee(pTable->aCol)
87a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
87b0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
87c0: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
87d0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
87e0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
87f0: 76 65 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 73 74  very VIEW..*/.st
8800: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
8810: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
8820: 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  ite *db, int idx
8830: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
8840: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 61 44 62  ;.  if( (db->aDb
8850: 5b 69 64 78 5d 2e 66 6c 61 67 73 20 26 20 53 51  [idx].flags & SQ
8860: 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77  LITE_UnresetView
8870: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
8880: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
8890: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
88a0: 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20  [idx].tblHash); 
88b0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
88c0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
88d0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
88e0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
88f0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
8900: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
8910: 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75  iteViewResetColu
8920: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20  mnNames(pTab);. 
8930: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 61     }.  }.  db->a
8940: 44 62 5b 69 64 78 5d 2e 66 6c 61 67 73 20 26 3d  Db[idx].flags &=
8950: 20 7e 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74   ~SQLITE_Unreset
8960: 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Views;.}../*.** 
8970: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c  Given a token, l
8980: 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77  ook up a table w
8990: 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20  ith that name.  
89a0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65  If not found, le
89b0: 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ave.** an error 
89c0: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 74  for the parser t
89d0: 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72  o find and retur
89e0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65  n NULL..*/.Table
89f0: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f   *sqliteTableFro
8a00: 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  mToken(Parse *pP
8a10: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
8a20: 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  k){.  char *zNam
8a30: 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  e;.  Table *pTab
8a40: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
8a50: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
8a60: 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66  oken(pTok);.  if
8a70: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
8a80: 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  urn 0;.  pTab = 
8a90: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
8aa0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
8ab0: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46  e, 0);.  sqliteF
8ac0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
8ad0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8ae0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
8af0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8b00: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
8b10: 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20  le: ", 0, .     
8b20: 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b     pTok->z, pTok
8b30: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ->n, 0);.    pPa
8b40: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  rse->nErr++;.  }
8b50: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
8b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8b70: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8b80: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
8b90: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
8ba0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
8bb0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
8bc0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
8bd0: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
8be0: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62  id sqliteDropTab
8bf0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
8c00: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8c10: 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54  int isView){.  T
8c20: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
8c30: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62  Vdbe *v;.  int b
8c40: 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  ase;.  sqlite *d
8c50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8c60: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
8c70: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
8c80: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
8c90: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
8ca0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
8cb0: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
8cc0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b  (pParse, pName);
8cd0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
8ce0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 44 62   ) return;.  iDb
8cf0: 20 3d 20 70 54 61 62 6c 65 2d 3e 69 44 62 3b 0a   = pTable->iDb;.
8d00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8d10: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
8d20: 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41 75  N.  if( sqliteAu
8d30: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
8d40: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 53  SQLITE_DELETE, S
8d50: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62  CHEMA_TABLE(pTab
8d60: 6c 65 2d 3e 69 44 62 29 2c 30 29 29 7b 0a 20 20  le->iDb),0)){.  
8d70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8d80: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
8d90: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
8da0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d  {.      if( iDb=
8db0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
8dc0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
8dd0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
8de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8df0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
8e00: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
8e10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
8e20: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
8e30: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
8e40: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
8e50: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
8e60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
8e70: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
8e80: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
8e90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
8ea0: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
8eb0: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 6c  rse, code, pTabl
8ec0: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  e->zName, 0) ){.
8ed0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8ee0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
8ef0: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
8f00: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
8f10: 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  E, pTable->zName
8f20: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
8f30: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
8f40: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61  #endif.  if( pTa
8f50: 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ble->readOnly ){
8f60: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8f70: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8f80: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
8f90: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
8fa0: 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f  .       " may no
8fb0: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
8fc0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
8fd0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
8fe0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56  n;.  }.  if( isV
8ff0: 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70  iew && pTable->p
9000: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
9010: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
9020: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
9030: 67 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  g, "use DROP TAB
9040: 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
9050: 6c 65 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62  le ",.      pTab
9060: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
9070: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9080: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
9090: 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
90a0: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
90b0: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
90c0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
90d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73  se->zErrMsg, "us
90e0: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
90f0: 65 6c 65 74 65 20 76 69 65 77 20 22 2c 0a 20 20  elete view ",.  
9100: 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d      pTable->zNam
9110: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
9120: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
9130: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
9140: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9150: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
9160: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
9170: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
9180: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
9190: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
91a0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
91b0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
91c0: 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b  dbeOp dropTable[
91d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
91e0: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
91f0: 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(8),  0},.  
9200: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
9210: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
9220: 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20    0}, /* 1 */.  
9230: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
9240: 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
9250: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9260: 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
9270: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
9280: 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   3 */.      { OP
9290: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
92a0: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
92b0: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
92c0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 37 29 2c       0, ADDR(7),
92d0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
92e0: 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
92f0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
9300: 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
9310: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
9320: 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20    0}, /* 7 */.  
9330: 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a    };.    Index *
9340: 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65  pIdx;.    Trigge
9350: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
9360: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
9370: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
9380: 65 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 69 44  e, 0, pTable->iD
9390: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70  b);.    sqliteOp
93a0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
93b0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20   pTable->iDb);. 
93c0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
93d0: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
93e0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
93f0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
9400: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
9410: 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  = pTable->pTrigg
9420: 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  er;.    while( p
9430: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
9440: 20 53 72 63 4c 69 73 74 20 2a 70 4e 6d 3b 0a 20   SrcList *pNm;. 
9450: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
9460: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62  igger->iDb==pTab
9470: 6c 65 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20  le->iDb );.     
9480: 20 70 4e 6d 20 3d 20 73 71 6c 69 74 65 53 72 63   pNm = sqliteSrc
9490: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c  ListAppend(0, 0,
94a0: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 6d 2d 3e   0);.      pNm->
94b0: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[0].zName = sql
94c0: 69 74 65 53 74 72 44 75 70 28 70 54 72 69 67 67  iteStrDup(pTrigg
94d0: 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  er->name);.     
94e0: 20 70 4e 6d 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61   pNm->a[0].zData
94f0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
9500: 44 75 70 28 64 62 2d 3e 61 44 62 5b 70 54 61 62  Dup(db->aDb[pTab
9510: 6c 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  le->iDb].zName);
9520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 72 6f  .      sqliteDro
9530: 70 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  pTrigger(pParse,
9540: 20 70 4e 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20   pNm, 1);.      
9550: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
9560: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
9570: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
9580: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
9590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
95a0: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c  pTrigger = pTabl
95b0: 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  e->pTrigger;.   
95c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
95d0: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
95e0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
95f0: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
9600: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
9610: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
9620: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
9630: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
9640: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  0);.    if( !pTa
9650: 62 6c 65 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20  ble->iDb ){.    
9660: 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f    sqliteChangeCo
9670: 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20  okie(db, v);.   
9680: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
9690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
96a0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  se, 0, 0);.    i
96b0: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
96c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
96d0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
96e0: 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c  y, pTable->tnum,
96f0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20   pTable->iDb);. 
9700: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
9710: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
9720: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9730: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
9740: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9750: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
9760: 64 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65  dx->tnum, pTable
9770: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ->iDb);.      }.
9780: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9790: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
97a0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  n(pParse);.  }..
97b0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
97c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69  in-memory descri
97d0: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
97e0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  le..  **.  ** Ex
97f0: 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20  ception: if the 
9800: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
9810: 67 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50  gan with the EXP
9820: 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20  LAIN keyword,.  
9830: 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67  ** then no chang
9840: 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  es should be mad
9850: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
9860: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
9870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69  {.    sqliteUnli
9880: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
9890: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
98a0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
98b0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
98c0: 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ges;.  }.  sqlit
98d0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
98e0: 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
98f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   This routine co
9900: 6e 73 74 72 75 63 74 73 20 61 20 50 33 20 73 74  nstructs a P3 st
9910: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
9920: 72 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  r an OP_MakeIdxK
9930: 65 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64  ey.** opcode and
9940: 20 61 64 64 73 20 74 68 61 74 20 50 33 20 73 74   adds that P3 st
9950: 72 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74  ring to the most
9960: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
9970: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ed instruction.*
9980: 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  * in the virtual
9990: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50   machine.  The P
99a0: 33 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  3 string consist
99b0: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68  s of a single ch
99c0: 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65  aracter.** for e
99d0: 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
99e0: 65 20 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20  e index pIdx of 
99f0: 74 61 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20  table pTab.  If 
9a00: 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a  the column uses.
9a10: 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72  ** a numeric sor
9a20: 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
9a30: 65 20 50 33 20 73 74 72 69 6e 67 20 63 68 61 72  e P3 string char
9a40: 61 63 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  acter correspond
9a50: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63  ing to.** that c
9a60: 6f 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49  olumn is 'n'.  I
9a70: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65  f the column use
9a80: 73 20 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72  s a text sort or
9a90: 64 65 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  der, then the.**
9aa0: 20 50 33 20 73 74 72 69 6e 67 20 69 73 20 27 74   P3 string is 't
9ab0: 27 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d  '.  See the OP_M
9ac0: 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65  akeIdxKey opcode
9ad0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
9ae0: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
9af0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
9b00: 65 65 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69  ee also the sqli
9b10: 74 65 41 64 64 4b 65 79 54 79 70 65 28 29 20 72  teAddKeyType() r
9b20: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
9b30: 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54  sqliteAddIdxKeyT
9b40: 79 70 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64  ype(Vdbe *v, Ind
9b50: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61  ex *pIdx){.  cha
9b60: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c  r *zType;.  Tabl
9b70: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
9b80: 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
9b90: 49 64 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e  Idx!=0 && pIdx->
9ba0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70  pTable!=0 );.  p
9bb0: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
9bc0: 6c 65 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  le;.  n = pIdx->
9bd0: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65  nColumn;.  zType
9be0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
9bf0: 61 77 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  aw( n+1 );.  if(
9c00: 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75   zType==0 ) retu
9c10: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
9c20: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
9c30: 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  t iCol = pIdx->a
9c40: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
9c50: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
9c60: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
9c70: 6f 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ol );.    if( (p
9c80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9c90: 73 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49  sortOrder & SQLI
9ca0: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d  TE_SO_TYPEMASK)=
9cb0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
9cc0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69  ){.      zType[i
9cd0: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c  ] = 't';.    }el
9ce0: 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b  se{.      zType[
9cf0: 69 5d 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a  i] = 'n';.    }.
9d00: 20 20 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d    }.  zType[n] =
9d10: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
9d20: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
9d30: 7a 54 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c  zType, n);.  sql
9d40: 69 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a  iteFree(zType);.
9d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9d60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9d70: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
9d80: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
9d90: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
9da0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9db0: 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
9dc0: 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
9dd0: 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
9de0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
9df0: 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
9e00: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
9e10: 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
9e20: 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
9e30: 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
9e40: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
9e50: 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
9e60: 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
9e70: 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
9e80: 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
9e90: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
9ea0: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
9eb0: 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
9ec0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
9ed0: 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
9ee0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
9ef0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
9f00: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
9f10: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
9f20: 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
9f30: 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
9f40: 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
9f50: 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
9f60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
9f70: 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
9f80: 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
9f90: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
9fa0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
9fb0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
9fc0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
9fd0: 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
9fe0: 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
9ff0: 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
a000: 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
a010: 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
a020: 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
a030: 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
a040: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
a050: 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
a060: 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
a070: 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
a080: 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
a090: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
a0a0: 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  teDeferForeignKe
a0b0: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
a0c0: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
a0d0: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
a0e0: 65 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  eCreateForeignKe
a0f0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
a100: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
a110: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a120: 20 20 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43    IdList *pFromC
a130: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
a140: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
a150: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
a160: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
a170: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
a180: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
a190: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
a1a0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43  /.  IdList *pToC
a1b0: 6f 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ol,      /* Colu
a1c0: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
a1d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
a1e0: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
a1f0: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
a200: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
a210: 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ms. */.){.  Tabl
a220: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
a230: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
a240: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
a250: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
a260: 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70  ar *z;.  FKey *p
a270: 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73  FKey = 0;..  ass
a280: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
a290: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
a2a0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
a2b0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
a2c0: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
a2d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
a2e0: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
a2f0: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
a300: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
a310: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
a320: 6e 49 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  nId!=1 ){.      
a330: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
a340: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
a350: 67 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  g, "foreign key 
a360: 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20  on ", -1,.      
a370: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
a380: 2e 7a 4e 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20  .zName, -1, .   
a390: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
a3a0: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
a3b0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
a3c0: 65 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  e ", -1,.       
a3d0: 20 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e    pTo->z, pTo->n
a3e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
a3f0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
a400: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
a410: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
a420: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
a430: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
a440: 3e 6e 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  >nId!=pFromCol->
a450: 6e 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nId ){.    sqlit
a460: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
a470: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20  se->zErrMsg, .  
a480: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
a490: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
a4a0: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
a4b0: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
a4c0: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
a4d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
a4e0: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
a4f0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
a500: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
a510: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
a520: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
a530: 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20  FromCol->nId;.  
a540: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
a550: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
a560: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
a570: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
a580: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
a590: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
a5a0: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49  =0; i<pToCol->nI
a5b0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  d; i++){.      n
a5c0: 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70  Byte += strlen(p
a5d0: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
a5e0: 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
a5f0: 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
a600: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
a610: 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
a620: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
a630: 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
a640: 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
a650: 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
a660: 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
a670: 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46  )&pFKey[1];.  pF
a680: 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72  Key->aCol = (str
a690: 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a  uct sColMap*)z;.
a6a0: 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74    z += sizeof(st
a6b0: 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43  ruct sColMap)*nC
a6c0: 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  ol;.  pFKey->zTo
a6d0: 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
a6e0: 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
a6f0: 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
a700: 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e   0;.  z += pTo->
a710: 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  n+1;.  pFKey->pN
a720: 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b  extTo = 0;.  pFK
a730: 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
a740: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
a750: 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
a760: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
a770: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
a780: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
a790: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
a7a0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
a7b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
a7c0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
a7d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
a7e0: 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
a7f0: 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
a800: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
a810: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
a820: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
a830: 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
a840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a850: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a860: 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
a870: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a880: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
a890: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
a8a0: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
a8b0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
a8c0: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
a8d0: 6d 65 2c 20 22 5c 22 20 69 6e 20 66 6f 72 65 69  me, "\" in forei
a8e0: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
a8f0: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  n", 0);.        
a900: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
a910: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
a920: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
a930: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
a940: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
a950: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
a960: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
a970: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
a980: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
a990: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
a9a0: 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
a9b0: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
a9c0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
a9d0: 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
a9e0: 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
a9f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
aa00: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
aa10: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64   = 0;.  pFKey->d
aa20: 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67  eleteConf = flag
aa30: 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  s & 0xff;.  pFKe
aa40: 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20  y->updateConf = 
aa50: 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
aa60: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  0xff;.  pFKey->i
aa70: 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61  nsertConf = (fla
aa80: 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66  gs >> 16 ) & 0xf
aa90: 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  f;..  /* Link th
aaa0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
aab0: 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
aac0: 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
aad0: 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
aae0: 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
aaf0: 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
ab00: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
ab10: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
ab20: 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b  elete(pFromCol);
ab30: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
ab40: 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
ab50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ab60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
ab70: 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
ab80: 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
ab90: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
aba0: 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
abb0: 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
abc0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
abd0: 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
abe0: 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
abf0: 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
ac00: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
ac10: 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
ac20: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
ac30: 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
ac40: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
ac50: 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
ac60: 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
ac70: 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
ac80: 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
ac90: 69 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  iteDeferForeignK
aca0: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
acb0: 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
acc0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
acd0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
ace0: 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
acf0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ad00: 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
ad10: 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
ad20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
ad30: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
ad40: 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a   isDeferred;.}..
ad50: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
ad60: 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
ad70: 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64  SQL table.  pInd
ad80: 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ex is the name o
ad90: 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
ada0: 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68  and pTable is th
adb0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
adc0: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
add0: 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
ade0: 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
adf0: 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
ae00: 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
ae10: 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
ae20: 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
ae30: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
ae40: 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
ae50: 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
ae60: 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
ae70: 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
ae80: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
ae90: 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
aea0: 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
aeb0: 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
aec0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
aed0: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
aee0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
aef0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
af00: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
af10: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
af20: 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
af30: 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
af40: 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
af50: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
af60: 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
af70: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
af80: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
af90: 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
afa0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
afb0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
afc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
afd0: 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
afe0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
aff0: 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
b000: 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
b010: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
b020: 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  me,    /* Name o
b030: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
b040: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
b050: 72 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 2c 20  rcList *pTable, 
b060: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
b070: 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20  able to index.  
b080: 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
b090: 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
b0a0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  IdList *pList,  
b0b0: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
b0c0: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
b0d0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
b0e0: 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f  rror,     /* OE_
b0f0: 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
b100: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
b110: 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 69 6e   OE_None */.  in
b120: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
b130: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
b140: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e  s a temporary in
b150: 64 65 78 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  dex */.  Token *
b160: 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65  pStart,   /* The
b170: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
b180: 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41  at begins a CREA
b190: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
b1a0: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
b1b0: 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20  End      /* The 
b1c0: 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
b1d0: 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
b1e0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
b1f0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
b200: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
b210: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
b220: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
b230: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
b240: 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
b250: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
b260: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
b270: 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20  Token nullId;   
b280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
b290: 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
b2a0: 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
b2b0: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
b2c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
b2d0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
b2e0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
b2f0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
b300: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b310: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
b320: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
b330: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
b340: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
b350: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
b360: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  */.  if( pTable!
b370: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
b380: 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( pName!=0 );.  
b390: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
b3a0: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20  ->nSrc==1 );.   
b3b0: 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65 53   pTab =  sqliteS
b3c0: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
b3d0: 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  rse, pTable);.  
b3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
b3f0: 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
b400: 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
b410: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
b420: 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  }.  if( pTab==0 
b430: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
b440: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
b450: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
b460: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
b470: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
b480: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
b490: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
b4a0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
b4b0: 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62       " may not b
b4c0: 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a  e indexed", 0);.
b4d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
b4e0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
b4f0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
b500: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 54 65 6d    }.  if( !isTem
b510: 70 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3e 3d  p && pTab->iDb>=
b520: 32 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69  2 && pParse->ini
b530: 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20  tFlag==0 ){.    
b540: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
b550: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
b560: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
b570: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
b580: 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e  " may not have n
b590: 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 69 6e 64  on-temporary ind
b5a0: 69 63 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b  ices added", 0);
b5b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
b5c0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  r++;.    goto ex
b5d0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b5e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
b5f0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
b600: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
b610: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
b620: 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
b630: 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29   be indexed", 0)
b640: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
b650: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rr++;.    goto e
b660: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
b680: 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ->iDb==1 ){.    
b690: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 20 20 7d 0a  isTemp = 1;.  }.
b6a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
b6b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b6c0: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
b6d0: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
b6e0: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
b6f0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
b700: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
b710: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
b720: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
b730: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
b740: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
b750: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
b760: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
b770: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b780: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
b790: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
b7a0: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
b7b0: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
b7c0: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
b7d0: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
b7e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
b7f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
b800: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
b810: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
b820: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
b830: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
b840: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
b850: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
b860: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
b870: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
b880: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
b890: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
b8a0: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
b8b0: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
b8c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
b8d0: 65 20 26 26 20 21 70 50 61 72 73 65 2d 3e 69 6e  e && !pParse->in
b8e0: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 49 6e  itFlag ){.    In
b8f0: 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
b900: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
b910: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
b920: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54  me name */.    T
b930: 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65  able *pTSameName
b940: 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;    /* A table 
b950: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
b960: 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s the index */. 
b970: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
b980: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
b990: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
b9a0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
b9b0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
b9c0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
b9d0: 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pISameName = s
b9e0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
b9f0: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
ba00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ba10: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
ba20: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
ba30: 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20  ex ", zName, .  
ba40: 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79         " already
ba50: 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20   exists", 0);.  
ba60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
ba70: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ++;.      goto e
ba80: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
ba90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
baa0: 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pTSameName = sq
bab0: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62  liteFindTable(db
bac0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
bad0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
bae0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
baf0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72  ->zErrMsg, "ther
bb00: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
bb10: 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20  able named ",.  
bb20: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29         zName, 0)
bb30: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
bb40: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
bb50: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
bb60: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
bb70: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
bb80: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
bb90: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
bba0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
bbb0: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
bbc0: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
bbd0: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
bbe0: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
bbf0: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
bc00: 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29  tf(zBuf,"%d)",n)
bc10: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
bc20: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
bc30: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22  ring(&zName, "("
bc40: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  , pTab->zName, "
bc50: 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42   autoindex ", zB
bc60: 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  uf, 0);.    if( 
bc70: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
bc80: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
bc90: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
bca0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
bcb0: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
bcc0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a  pName->n);.  }..
bcd0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
bce0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
bcf0: 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
bd00: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
bd10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
bd20: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
bd30: 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69  ( isTemp==0 || i
bd40: 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73  sTemp==1 );.  as
bd50: 73 65 72 74 28 20 70 54 61 62 2d 3e 69 44 62 3d  sert( pTab->iDb=
bd60: 3d 70 50 61 72 73 65 2d 3e 69 44 62 20 7c 7c 20  =pParse->iDb || 
bd70: 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 69  isTemp==1 );.  i
bd80: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
bd90: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
bda0: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
bdb0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
bdc0: 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  0) ){.    goto e
bdd0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bde0: 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 53 51 4c 49  ;.  }.  i = SQLI
bdf0: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
be00: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20  .  if( isTemp ) 
be10: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
be20: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
be30: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
be40: 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
be50: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
be60: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
be70: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
be80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
be90: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
bea0: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
beb0: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
bec0: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
bed0: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
bee0: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
bef0: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
bf00: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
bf10: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
bf20: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
bf30: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
bf40: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
bf50: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
bf60: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
bf70: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
bf80: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
bf90: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
bfa0: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
bfb0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
bfc0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
bfd0: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
bfe0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
bff0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c000: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
c010: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
c020: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
c030: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
c040: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
c050: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
c060: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
c070: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
c090: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
c0a0: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
c0b0: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
c0c0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c0d0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
c0e0: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
c0f0: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
c100: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
c110: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
c120: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
c130: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
c140: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
c150: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
c160: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
c170: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
c180: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
c190: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  ex->onError = pI
c1a0: 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d  ndex->isUnique =
c1b0: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
c1c0: 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
c1d0: 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64  pName==0;.  pInd
c1e0: 65 78 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d 70  ex->iDb = isTemp
c1f0: 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69   ? 1 : pParse->i
c200: 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74  Db;..  /* Scan t
c210: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
c220: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
c230: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
c240: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
c250: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
c260: 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
c270: 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
c280: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
c290: 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
c2a0: 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
c2b0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
c2c0: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
c2d0: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  +){.    for(j=0;
c2e0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
c2f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c300: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69  qliteStrICmp(pLi
c310: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
c320: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
c330: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
c340: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
c350: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
c360: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
c370: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
c380: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
c390: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
c3a0: 20 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f          " has no
c3b0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c   column named ",
c3c0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
c3d0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  me, 0);.      pP
c3e0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
c3f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
c400: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f  Index);.      go
c410: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
c420: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
c430: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
c440: 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20  [i] = j;.  }..  
c450: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
c460: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
c470: 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
c480: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
c490: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
c4a0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
c4b0: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  . .  */.  if( !p
c4c0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
c4d0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
c4e0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61      p = sqliteHa
c4f0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
c500: 62 5b 69 73 54 65 6d 70 5d 2e 69 64 78 48 61 73  b[isTemp].idxHas
c510: 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
c530: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
c540: 65 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  en(zName)+1, pIn
c550: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
c560: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c570: 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
c580: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
c590: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
c5a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
c5b0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
c5c0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
c5d0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
c5e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
c5f0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
c600: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
c610: 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
c620: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
c630: 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
c640: 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
c650: 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
c660: 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
c670: 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
c680: 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
c690: 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
c6a0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
c6b0: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
c6c0: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
c6d0: 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
c6e0: 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
c6f0: 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
c700: 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
c710: 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
c720: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
c730: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
c740: 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64  place){.    pInd
c750: 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
c760: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
c770: 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
c780: 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
c790: 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
c7a0: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
c7b0: 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
c7c0: 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
c7d0: 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
c7e0: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
c7f0: 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d  {.      pOther =
c800: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
c810: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
c820: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
c830: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74  ->pNext;.    pOt
c840: 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
c850: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dex;.  }..  /* I
c860: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
c870: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
c880: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
c890: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
c8a0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
c8b0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
c8c0: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
c8d0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
c8e0: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
c8f0: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
c900: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
c910: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
c920: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
c930: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
c940: 61 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20  ag && pTable!=0 
c950: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  ){.    pIndex->t
c960: 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65  num = pParse->ne
c970: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
c980: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
c990: 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
c9a0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
c9b0: 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
c9c0: 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
c9d0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
c9e0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
c9f0: 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
ca00: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
ca10: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
ca20: 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
ca30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e    **.  ** The in
ca40: 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e  itFlag is 0 when
ca50: 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
ca60: 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
ca70: 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
ca80: 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c  and.  The initFl
ca90: 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  ag is 1 when a d
caa0: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
cab0: 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
cac0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
cad0: 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
cae0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
caf0: 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
cb00: 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
cb10: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
cb20: 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
cb30: 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
cb40: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
cb50: 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
cb60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
cb70: 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  able==0 it means
cb80: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
cb90: 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
cba0: 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
cbb0: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
cbc0: 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
cbd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
cbe0: 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
cbf0: 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
cc00: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
cc10: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
cc20: 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
cc30: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
cc40: 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
cc50: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
cc60: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
cc70: 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a  >initFlag==0 ){.
cc80: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
cc90: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
cca0: 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20  lbl1, lbl2;.    
ccb0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
ccc0: 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  ddr;..    v = sq
ccd0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
cce0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
ccf0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
cd00: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
cd10: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
cd20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
cd30: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
cd40: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65  (pParse, 0, isTe
cd50: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
cd60: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
cd70: 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20  (v, isTemp);.   
cd80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
cd90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
cda0: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
cdb0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cdc0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
cdd0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
cde0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
cdf0: 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c 20 50 33   -1, "index", P3
ce00: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
ce10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ce20: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
ce30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
ce40: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
ce50: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
ce60: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ce70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ce80: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
ce90: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
cea0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
ceb0: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
cec0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ced0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
cee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
cef0: 61 74 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54  ateIndex, 0, isT
cf00: 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
cf10: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
cf20: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49  addr, (char*)&pI
cf30: 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  ndex->tnum, P3_P
cf40: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e  OINTER);.    pIn
cf50: 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20  dex->tnum = 0;. 
cf60: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
cf70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
cf80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
cf90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
cfa0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cfb0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73  , OP_Integer, is
cfc0: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  Temp, 0);.      
cfd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cfe0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
cff0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
d000: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
d010: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
d020: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
d030: 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
d040: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20  pEnd ){.      n 
d050: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
d060: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
d070: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
d080: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
d090: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
d0a0: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >z, n);.    }.  
d0b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d0c0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
d0d0: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73  rd, 5, 0);.    s
d0e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d0f0: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
d100: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
d110: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  Table ){.      s
d120: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d130: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
d140: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
d150: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d160: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
d170: 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  d, 2, pTab->tnum
d180: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
d190: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d1a0: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
d1b0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d1c0: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
d1d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
d1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d1f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
d200: 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
d210: 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
d220: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d230: 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a  P_Recno, 2, 0);.
d240: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d250: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
d260: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d270: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d280: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
d290: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
d2a0: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
d2b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d2c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
d2d0: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
d2e0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
d2f0: 20 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66    if( db->file_f
d300: 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74  ormat>=4 ) sqlit
d310: 65 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 76  eAddIdxKeyType(v
d320: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  , pIndex);.     
d330: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d340: 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31  (v, OP_IdxPut, 1
d350: 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  , pIndex->onErro
d360: 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20  r!=OE_None);.   
d370: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
d380: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e  ngeP3(v, -1, "in
d390: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
d3a0: 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
d3b0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
d3c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d3d0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
d3e0: 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
d3f0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
d400: 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20  bel(v, lbl2);.  
d410: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d420: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
d430: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
d440: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d450: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
d460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d470: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
d480: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
d490: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d4a0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
d4b0: 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   v);.      }.   
d4c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d4d0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d4e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d4f0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
d500: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
d510: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
d520: 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
d530: 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
d540: 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
d550: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
d560: 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
d570: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
d580: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
d590: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
d5a0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
d5b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d5c0: 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
d5d0: 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
d5e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
d5f0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
d600: 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
d610: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
d620: 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61  liteDropIndex(Pa
d630: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
d640: 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
d650: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
d660: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
d670: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
d680: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
d690: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
d6a0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
d6b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
d6c0: 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
d6d0: 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20  ==1 );.  pIndex 
d6e0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
d6f0: 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
d700: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
d710: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
d720: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
d730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72   ){.    sqliteEr
d740: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d750: 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
d760: 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
d770: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
d780: 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
d790: 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
d7a0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
d7b0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
d7c0: 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
d7d0: 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
d7e0: 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
d7f0: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
d800: 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
d810: 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
d820: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
d830: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
d840: 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b  pIndex->iDb>1 ){
d850: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
d860: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
d870: 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61  not alter schema
d880: 20 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20   of attached ". 
d890: 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73        "databases
d8a0: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
d8b0: 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
d8c0: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
d8d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
d8e0: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
d8f0: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
d900: 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
d910: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
d920: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
d930: 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74     if( sqliteAut
d940: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
d950: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 53 43  QLITE_DELETE, SC
d960: 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65  HEMA_TABLE(pInde
d970: 78 2d 3e 69 44 62 29 2c 20 30 29 20 29 7b 0a 20  x->iDb), 0) ){. 
d980: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
d990: 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
d9a0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
d9b0: 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51  >iDb ) code = SQ
d9c0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
d9d0: 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
d9e0: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
d9f0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
da00: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
da10: 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
da20: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
da30: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
da40: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
da50: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
da60: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
da70: 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
da80: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
da90: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
daa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
dab0: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
dac0: 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78  VdbeOp dropIndex
dad0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
dae0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
daf0: 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20   ADDR(9), 0}, . 
db00: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
db10: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
db20: 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20    0}, /* 1 */.  
db30: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
db40: 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
db50: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
db60: 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30  MemLoad,    1, 0
db70: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33  ,       0}, /* 3
db80: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
db90: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c  olumn,     0, 1,
dba0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
dbb0: 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
dbc0: 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d    0, ADDR(8), 0}
dbd0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
dbe0: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
dbf0: 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (3), 0},.      {
dc00: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
dc10: 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a  0, ADDR(9), 0},.
dc20: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
dc30: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
dc40: 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20     0}, /* 8 */. 
dc50: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61     };.    int ba
dc60: 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 42  se;..    sqliteB
dc70: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
dc80: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49  on(pParse, 0, pI
dc90: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
dca0: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
dcb0: 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d  Table(v, pIndex-
dcc0: 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20  >iDb);.    base 
dcd0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
dce0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
dcf0: 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64  ze(dropIndex), d
dd00: 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ropIndex);.    s
dd10: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
dd20: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e  3(v, base+1, pIn
dd30: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
dd40: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
dd50: 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  iDb==0 ){.      
dd60: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
dd70: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d  ie(db, v);.    }
dd80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
dd90: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
dda0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
ddb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ddc0: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64  OP_Destroy, pInd
ddd0: 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78  ex->tnum, pIndex
dde0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
ddf0: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
de00: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
de10: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
de20: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
de30: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ription of this 
de40: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
de50: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
de60: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
de70: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
de80: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
de90: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
dea0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
deb0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78  Changes;.  }..ex
dec0: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
ded0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
dee0: 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
def0: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
df00: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
df10: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
df20: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
df30: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
df40: 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
df50: 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
df60: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
df70: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
df80: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
df90: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
dfa0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
dfb0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
dfc0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
dfd0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
dfe0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
dff0: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
e000: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
e010: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
e020: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
e030: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
e040: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
e050: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
e060: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
e070: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
e080: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
e090: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
e0a0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
e0b0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
e0c0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
e0d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
e0e0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
e0f0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
e100: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e110: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
e120: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
e130: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
e140: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
e150: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e160: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
e170: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
e180: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
e190: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
e1a0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
e1b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
e1c0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
e1d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
e1e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e1f0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
e200: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
e210: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
e220: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
e230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
e240: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
e250: 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
e260: 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
e270: 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
e280: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
e290: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
e2a0: 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
e2b0: 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
e2c0: 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
e2d0: 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
e2e0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
e2f0: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
e300: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
e310: 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
e320: 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
e330: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
e340: 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
e350: 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
e360: 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
e370: 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
e380: 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
e390: 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
e3a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
e3b0: 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
e3c0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
e3d0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
e3e0: 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
e3f0: 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
e400: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
e410: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
e420: 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
e430: 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
e440: 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
e450: 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
e460: 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
e470: 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
e480: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
e490: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
e4a0: 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
e4b0: 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
e4c0: 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
e4d0: 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
e4e0: 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
e4f0: 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
e500: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
e510: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
e520: 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a  Append(A,B,0);.*
e530: 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
e540: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
e550: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
e560: 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
e570: 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
e580: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
e590: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
e5a0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
e5b0: 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
e5c0: 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
e5d0: 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
e5e0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
e5f0: 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
e600: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
e610: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
e620: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54  Token *pTable, T
e630: 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29  oken *pDatabase)
e640: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
e650: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
e660: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
e670: 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
e680: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
e690: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
e6a0: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
e6b0: 6e 53 72 63 20 26 20 37 29 3d 3d 31 20 29 7b 0a  nSrc & 7)==1 ){.
e6c0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
e6d0: 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  w;.    pNew = sq
e6e0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
e6f0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
e700: 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
e710: 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 2b   + (pList->nSrc+
e720: 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  8)*sizeof(pList-
e730: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
e740: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
e750: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
e760: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
e770: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
e780: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
e790: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pNew;.  }.  mem
e7a0: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
e7b0: 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73  ist->nSrc], 0, s
e7c0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
e7d0: 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ]));.  if( pData
e7e0: 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
e7f0: 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
e800: 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
e810: 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
e820: 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20  e && pTable ){. 
e830: 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
e840: 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
e850: 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
e860: 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
e870: 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69  = pTemp;.  }.  i
e880: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
e890: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
e8a0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
e8b0: 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  rc].zName;.    s
e8c0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
e8d0: 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
e8e0: 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
e8f0: 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
e900: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
e910: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
e920: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
e930: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e940: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
e950: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
e960: 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
e970: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
e980: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
e990: 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61  ist->nSrc].zData
e9a0: 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  base;.    sqlite
e9b0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
e9c0: 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61  Database->z, pDa
e9d0: 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20  tabase->n, 0);. 
e9e0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
e9f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
ea00: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
ea10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ea20: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ea30: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
ea40: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
ea50: 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b  }.  pList->nSrc+
ea60: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
ea70: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  t;.}../*.** Add 
ea80: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
ea90: 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
eaa0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
eab0: 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
eac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c  .void sqliteSrcL
ead0: 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
eae0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
eaf0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
eb00: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
eb10: 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
eb20: 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
eb30: 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c  Src - 1;.    sql
eb40: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
eb50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
eb60: 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  s, pToken->z, pT
eb70: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
eb80: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
eb90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
eba0: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
ebb0: 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
ebc0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
ebd0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
ebe0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
ebf0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
ec00: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
ec10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
ec20: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
ec30: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
ec40: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
ec50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
ec60: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
ec70: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
ec80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
ec90: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
eca0: 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
ecb0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
ecc0: 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
ecd0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
ece0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64 4c 69  /.int sqliteIdLi
ecf0: 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
ed00: 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
ed10: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
ed20: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
ed30: 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
ed40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
ed50: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
ed60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
ed70: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
ed80: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
ed90: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
eda0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
edb0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
edc0: 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
edd0: 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
ede0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
edf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
ee00: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
ee10: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
ee20: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
ee30: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
ee40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
ee50: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
ee60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
ee70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  List->a[i].zData
ee80: 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
ee90: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
eea0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
eeb0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
eec0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
eed0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
eee0: 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d  ].pTab && pList-
eef0: 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72  >a[i].pTab->isTr
ef00: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
ef10: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
ef20: 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  le(0, pList->a[i
ef30: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
ef40: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
ef50: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
ef60: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
ef70: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
ef80: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e  (pList->a[i].pOn
ef90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49 64 4c  );.    sqliteIdL
efa0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  istDelete(pList-
efb0: 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  >a[i].pUsing);. 
efc0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
efd0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
efe0: 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
eff0: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
f000: 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74  iteBeginTransact
f010: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
f020: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
f030: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
f040: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
f050: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
f060: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
f070: 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
f080: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
f090: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
f0a0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
f0b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f0c0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
f0d0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
f0e0: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
f0f0: 49 4e 22 2c 20 30 29 20 29 20 72 65 74 75 72 6e  IN", 0) ) return
f100: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
f110: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
f120: 6e 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ns ){.    sqlite
f130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f140: 20 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61   "cannot start a
f150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74   transaction wit
f160: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
f170: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n");.    return;
f180: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 65 67  .  }.  sqliteBeg
f190: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
f1a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
f1b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
f1c0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
f1d0: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f   db->onError = o
f1e0: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
f1f0: 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
f200: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
f210: 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61  liteCommitTransa
f220: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
f230: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
f240: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
f250: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
f260: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
f270: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
f280: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f290: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
f2a0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
f2b0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
f2c0: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
f2d0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f2e0: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
f2f0: 20 22 43 4f 4d 4d 49 54 22 2c 20 30 29 20 29 20   "COMMIT", 0) ) 
f300: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
f310: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
f320: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
f330: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
f340: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
f350: 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20  not commit - no 
f360: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
f370: 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74  ctive");.    ret
f380: 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  urn;.  }.  db->f
f390: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
f3a0: 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74  InTrans;.  sqlit
f3b0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
f3c0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 64 62  on(pParse);.  db
f3d0: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44  ->onError = OE_D
f3e0: 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  efault;.}../*.**
f3f0: 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
f400: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
f410: 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72  sqliteRollbackTr
f420: 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
f430: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
f440: 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
f450: 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
f460: 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
f470: 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
f480: 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
f490: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
f4a0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
f4b0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
f4c0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
f4d0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
f4e0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f4f0: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
f500: 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 29 20 29  "ROLLBACK", 0) )
f510: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
f520: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f530: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
f540: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
f550: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
f560: 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20  nnot rollback - 
f570: 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
f580: 73 20 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20  s active");.    
f590: 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76  return; .  }.  v
f5a0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
f5b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f5c0: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  v ){.    sqliteV
f5d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
f5e0: 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a  ollback, 0, 0);.
f5f0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
f600: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
f610: 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
f620: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
f630: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f640: 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
f650: 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
f660: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66   schema cookie f
f670: 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20  or all.** named 
f680: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
f690: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
f6a0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
f6b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
f6c0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
f6d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
f6e0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  b;.  Vdbe *v = s
f6f0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
f700: 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rse);.  for(i=0;
f710: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f720: 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 31 20 7c  {.    if( i==1 |
f730: 7c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  | db->aDb[i].pBt
f740: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
f750: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f760: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
f770: 43 6f 6f 6b 69 65 2c 20 69 2c 20 64 62 2d 3e 61  Cookie, i, db->a
f780: 44 62 5b 69 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[i].schema_coo
f790: 6b 69 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72  kie);.  }.  pPar
f7a0: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
f7b0: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 1;.}../*.**
f7c0: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
f7d0: 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
f7e0: 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
f7f0: 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
f800: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
f810: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
f820: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
f830: 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
f840: 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
f850: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
f860: 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
f870: 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
f880: 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
f890: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
f8a0: 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
f8b0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
f8c0: 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74  he setCheckpoint
f8d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
f8e0: 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
f8f0: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
f900: 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
f910: 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
f920: 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
f930: 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
f940: 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
f950: 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
f960: 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
f970: 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
f980: 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
f990: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
f9a0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
f9b0: 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
f9c0: 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
f9d0: 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
f9e0: 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
f9f0: 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
fa00: 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
fa10: 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
fa20: 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
fa30: 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
fa40: 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
fa50: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
fa60: 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  et..**.** The te
fa70: 6d 70 4f 6e 6c 79 20 66 6c 61 67 20 69 6e 64 69  mpOnly flag indi
fa80: 63 61 74 65 73 20 74 68 61 74 20 6f 6e 6c 79 20  cates that only 
fa90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
faa0: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
fab0: 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 69 73 20  .** during this 
fac0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  write operation.
fad0: 20 20 54 68 65 20 70 72 69 6d 61 72 79 20 64 61    The primary da
fae0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
faf0: 6e 6f 74 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f 63  not.** write-loc
fb00: 6b 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 20 74  ked.  Only the t
fb10: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
fb20: 65 20 66 69 6c 65 20 67 65 74 73 20 61 20 77 72  e file gets a wr
fb30: 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 4f 74 68  ite lock..** Oth
fb40: 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
fb50: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 61   continue to rea
fb60: 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 70  d or write the p
fb70: 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 20  rimary database 
fb80: 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
fb90: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
fba0: 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
fbb0: 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68  Parse, int setCh
fbc0: 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 74 65  eckpoint, int te
fbd0: 6d 70 4f 6e 6c 79 29 7b 0a 20 20 56 64 62 65 20  mpOnly){.  Vdbe 
fbe0: 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
fbf0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
fc00: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
fc10: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
fc20: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20  se->trigStack ) 
fc30: 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68  return; /* if th
fc40: 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67  is is in a trigg
fc50: 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61  er */.  if( (pPa
fc60: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
fc70: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
fc80: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fc90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fca0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31 2c  _Transaction, 1,
fcb0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 74 65   0);.    if( !te
fcc0: 6d 70 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  mpOnly ){.      
fcd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fce0: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
fcf0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
fd00: 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79  sqliteCodeVerify
fd10: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 3b 0a  Schema(pParse);.
fd20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
fd30: 28 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20  ( setCheckpoint 
fd40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
fd50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65  eAddOp(v, OP_Che
fd60: 63 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a  ckpoint, 0, 0);.
fd70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
fd80: 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70  dOp(v, OP_Checkp
fd90: 6f 69 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  oint, 1, 0);.  }
fda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
fdb0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e  te code that con
fdc0: 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74  cludes an operat
fdd0: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76  ion that may hav
fde0: 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65  e changed.** the
fdf0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
fe00: 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20   is a companion 
fe10: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69  function to Begi
fe20: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
fe30: 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  )..** If a trans
fe40: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
fe50: 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ed, then commit 
fe60: 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70  it.  If a checkp
fe70: 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72  oint was.** star
fe80: 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  ted then commit 
fe90: 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  that..*/.void sq
fea0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
feb0: 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
fec0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
fed0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74  .  if( pParse->t
fee0: 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72  rigStack ) retur
fef0: 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73  n; /* if this is
ff00: 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f   in a trigger */
ff10: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
ff20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ff30: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
ff40: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
ff50: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
ff60: 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20  ITE_InTrans ){. 
ff70: 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67     /* Do Nothing
ff80: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
ff90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ffa0: 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30  (v, OP_Commit, 0
ffb0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a              , 0);.  }.}.