/ Hex Artifact Content
Login

Artifact ef9fb5bbc951f879145edb6a2278d32565bc77b8:


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: 32 33 33 20 32 30 30 34 2f 30 36 2f 32 36 20 30  233 2004/06/26 0
0300: 38 3a 33 38 3a 32 35 20 64 61 6e 69 65 6c 6b 31  8:38:25 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70 50 61  lainFlag){.  pPa
0470: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 65  rse->explain = e
0480: 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20 70 50  xplainFlag;.  pP
0490: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
04a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
04b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
04c0: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53  after a single S
04d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  QL statement has
04e0: 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20   been.** parsed 
04f0: 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f 67 72  and a VDBE progr
0500: 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  am to execute th
0510: 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  at statement has
0520: 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65   been.** prepare
0530: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
0540: 20 70 75 74 73 20 74 68 65 20 66 69 6e 69 73 68   puts the finish
0550: 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74  ing touches on t
0560: 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
0570: 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  am and resets th
0580: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
0590: 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a  re for the next.
05a0: 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  ** parse..**.** 
05b0: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e 20  Note that if an 
05c0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
05d0: 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
05e0: 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20  case that.** no 
05f0: 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67 65  VDBE code was ge
0600: 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nerated..*/.void
0610: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0620: 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72  ding(Parse *pPar
0630: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
0640: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
0650: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
0660: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
0670: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  urn;..  /* Begin
0680: 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73   by generating s
0690: 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  ome termination 
06a0: 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20  code at the end 
06b0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65  of the.  ** vdbe
06c0: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20   program.  */.  
06d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
06e0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
06f0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
0700: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
0710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
0720: 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29  , OP_Halt, 0, 0)
0730: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
0740: 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  okie mask contai
0750: 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65  ns one bit for e
0760: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
0770: 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28  e open..    ** (
0780: 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69  Bit 0 is for mai
0790: 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20  n, bit 1 is for 
07a0: 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72  temp, and so for
07b0: 74 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20  th.)  Bits are. 
07c0: 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61     ** set for ea
07d0: 63 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ch database that
07e0: 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72   is used.  Gener
07f0: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72  ate code to star
0800: 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  t a.    ** trans
0810: 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75  action on each u
0820: 73 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  sed database and
0830: 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73   to verify the s
0840: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20  chema cookie.   
0850: 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64   ** on each used
0860: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
0870: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
0880: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 21 3d 30 20  ->cookieMask!=0 
0890: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73  ){.      u32 mas
08a0: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  k;.      int iDb
08b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
08c0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 70  dbeChangeP2(v, p
08d0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
08e0: 6f 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  o, sqlite3VdbeCu
08f0: 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
0900: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20       for(iDb=0, 
0910: 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e  mask=1; iDb<db->
0920: 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69  nDb; mask<<=1, i
0930: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
0940: 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73  f( (mask & pPars
0950: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d  e->cookieMask)==
0960: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
0970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0980: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61  eAddOp(v, OP_Tra
0990: 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28  nsaction, iDb, (
09a0: 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 77  mask & pParse->w
09b0: 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20  riteMask)!=0);. 
09c0: 20 20 20 20 20 20 20 69 66 28 20 69 44 62 21 3d         if( iDb!=
09d0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
09e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
09f0: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
0a00: 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d  ie, iDb, pParse-
0a10: 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
0a20: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
0a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
0a40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
0a50: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
0a60: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2b 31  se->cookieGoto+1
0a70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
0a80: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
0a90: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
0aa0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
0ab0: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
0ac0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
0ad0: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
0ae0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
0af0: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
0b00: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
0b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0b20: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
0b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0b40: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
0b50: 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73  rse->nVar, pPars
0b60: 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e->explain);.   
0b70: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 70 50   pParse->rc = pP
0b80: 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c  arse->nErr ? SQL
0b90: 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49  ITE_ERROR : SQLI
0ba0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61  TE_DONE;.    pPa
0bb0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
0bc0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
0bd0: 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
0be0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
0bf0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
0c00: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
0c10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
0c20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
0c30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0c40: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
0c50: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
0c60: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0c70: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
0c80: 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieMask = 0;.}../
0c90: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
0ca0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
0cb0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
0cc0: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
0cd0: 6c 61 72 20 64 61 74 61 62 61 73 65 20 74 61 62  lar database tab
0ce0: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
0cf0: 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62  e.** of that tab
0d00: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
0d10: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
0d20: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
0d30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
0d40: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
0d50: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
0d60: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
0d70: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
0d80: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
0d90: 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ched for the.** 
0da0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69  table and the fi
0db0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
0dc0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
0dd0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a   (No checking.**
0de0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74   for duplicate t
0df0: 61 62 6c 65 20 6e 61 6d 65 73 20 69 73 20 64 6f  able names is do
0e00: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
0e10: 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d   order is.** TEM
0e20: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
0e30: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78  IN, then any aux
0e40: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
0e50: 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20   added.** using 
0e60: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
0e70: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  nd..**.** See al
0e80: 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  so sqlite3Locate
0e90: 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c  Table()..*/.Tabl
0ea0: 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61  e *sqlite3FindTa
0eb0: 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  ble(sqlite *db, 
0ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
0ed0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
0ee0: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62  Database){.  Tab
0ef0: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  le *p = 0;.  int
0f00: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73   i;.  int rc = s
0f10: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
0f20: 28 64 62 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  (db, 0);.  asser
0f30: 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  t( zName!=0 );. 
0f40: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
0f50: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
0f60: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0f70: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
0f80: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
0f90: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
0fa0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
0fb0: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0fc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
0fd0: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
0fe0: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
0ff0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1000: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1010: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
1020: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1030: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1040: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1050: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
1070: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1080: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1090: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
10a0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
10b0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
10c0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
10d0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
10e0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
10f0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1100: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
1110: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1120: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1130: 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c  found..** Also l
1140: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1150: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1160: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
1170: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1180: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
1190: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
11a0: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
11b0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
11c0: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
11d0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
11e0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
11f0: 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46 69   where sqlite3Fi
1200: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1210: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
1220: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1230: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1250: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1260: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
1270: 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  *p;..  p = sqlit
1280: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
1290: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
12a0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
12b0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
12c0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
12d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12e0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
12f0: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1300: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1310: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1320: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1330: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1340: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1350: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1360: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
1370: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
1380: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
1390: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
13a0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
13b0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13d0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
13e0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
13f0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1400: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1410: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1420: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1430: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1440: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1450: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1460: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1470: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1480: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
1490: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
14a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
14b0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
14c0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
14d0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
14e0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
14f0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1500: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1510: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1520: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1530: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1540: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1550: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1560: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
1570: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
1580: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1590: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
15a0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
15b0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
15c0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
15d0: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
15e0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
15f0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1600: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1610: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
1620: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1640: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1650: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
1660: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65  t rc = sqlite3Re
1670: 61 64 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  adSchema(db, 0);
1680: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
1690: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
16a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
16b0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
16c0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
16d0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
16e0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
16f0: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
1700: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
1710: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
1720: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1730: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1740: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69  nd(&db->aDb[j].i
1750: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  dxHash, zName, s
1760: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
1770: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
1780: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
1790: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   p;.}../*.** Rem
17a0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
17b0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
17c0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
17d0: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
17e0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
17f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
1800: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
1810: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1820: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
1830: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
1840: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
1850: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
1860: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
1870: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
1880: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
1890: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
18a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
18b0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
18c0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
18d0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
18e0: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20   Index *pOld;.. 
18f0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26   assert( db!=0 &
1900: 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  & p->zName!=0 );
1910: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
1920: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
1930: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
1940: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
1970: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
1980: 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20  ;.  if( pOld!=0 
1990: 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20  && pOld!=p ){.  
19a0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
19b0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
19c0: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f  iDb].idxHash, pO
19d0: 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ld->zName,.     
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61  strlen(pOld->zNa
1a00: 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20  me)+1, pOld);.  
1a10: 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41  }.  if( p->zColA
1a20: 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ff ){.    sqlite
1a30: 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  Free(p->zColAff)
1a40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1a50: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
1a60: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1a70: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
1a80: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
1a90: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
1aa0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
1ab0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
1ac0: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
1ad0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
1ae0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
1af0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1b00: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1b10: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1b20: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
1b30: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
1b40: 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  x ){.    pIndex-
1b50: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
1b60: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
1b80: 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  dex *p;.    for(
1b90: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
1ba0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
1bb0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
1bc0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
1bd0: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
1be0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
1bf0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
1c00: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1c10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c20: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
1c30: 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  , pIndex);.}../*
1c40: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
1c50: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
1c60: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
1c70: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1c80: 6f 66 0a 2a 2a 20 61 20 73 69 67 6c 65 20 64 61  of.** a sigle da
1c90: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
1ca0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1cb0: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
1cc0: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
1cd0: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
1ce0: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
1cf0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
1d00: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
1d10: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
1d20: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
1d30: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  ion..**.** If iD
1d40: 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20  b<=0 then reset 
1d50: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
1d60: 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61  ema tables for a
1d70: 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
1d80: 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32  iles.  If iDb>=2
1d90: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
1da0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
1db0: 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  for only the.** 
1dc0: 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69  single file indi
1dd0: 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cated..*/.void s
1de0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
1df0: 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65  nalSchema(sqlite
1e00: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
1e10: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
1e20: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
1e30: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
1e40: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
1e50: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
1e60: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
1e70: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
1e80: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
1e90: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
1ea0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1eb0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
1ec0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
1ed0: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
1ee0: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
1ef0: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
1f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
1f10: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
1f20: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
1f30: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
1f40: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
1f50: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
1f60: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
1f70: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
1f80: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
1f90: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
1fa0: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
1fb0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
1fc0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
1fd0: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a  .      Trigger *
1fe0: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
1ff0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
2000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
2010: 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54 72  eleteTrigger(pTr
2020: 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  igger);.    }.  
2030: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2040: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20  ar(&temp2);.    
2050: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
2060: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53  &pDb->tblHash, S
2070: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
2080: 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70  G, 0);.    for(p
2090: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
20a0: 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45  irst(&temp1); pE
20b0: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
20c0: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
20d0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
20e0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
20f0: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2100: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
2110: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
2120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2130: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65  te3HashClear(&te
2140: 6d 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61  mp1);.    DbClea
2150: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  rProperty(db, i,
2160: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
2170: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30  );.    if( iDb>0
2180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
2190: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
21a0: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
21b0: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
21c0: 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49  Changes;..  /* I
21d0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
21e0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
21f0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
2200: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20  s been closed,. 
2210: 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20   ** then remove 
2220: 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75  then from the au
2230: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2240: 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20   list.  We take 
2250: 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75  the.  ** opportu
2260: 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20  nity to do this 
2270: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61  here since we ha
2280: 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ve just deleted 
2290: 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  all of the.  ** 
22a0: 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c  schema hash tabl
22b0: 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  es and therefore
22c0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
22d0: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
22e0: 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20  .  ** to any of 
22f0: 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2300: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2310: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2320: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2330: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2340: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2350: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
2360: 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70  ( pDb->pAux && p
2370: 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70  Db->xFreeAux ) p
2380: 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62  Db->xFreeAux(pDb
2390: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70  ->pAux);.      p
23a0: 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  Db->pAux = 0;.  
23b0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
23c0: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
23d0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
23e0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
23f0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2400: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2410: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
2420: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
2430: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
2440: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
2450: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
2460: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
2470: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
2480: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
2490: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
24a0: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
24b0: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
24c0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
24d0: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
24e0: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
24f0: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
2500: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
2510: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
2520: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
2530: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
2540: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
2550: 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44  qliteFree(db->aD
2560: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
2570: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
2580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2590: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
25a0: 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20  lled whenever a 
25b0: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
25c0: 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a    If there were.
25d0: 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ** schema change
25e0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
25f0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77  nsaction, then w
2600: 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20  e have to reset 
2610: 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  the.** internal 
2620: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2630: 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d  reload them from
2640: 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   disk..*/.void s
2650: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e  qlite3RollbackIn
2660: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2670: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
2680: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2690: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
26a0: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
26b0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
26c0: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  ema(db, 0);.  }.
26d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
26e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
26f0: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
2700: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
2710: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
2720: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
2730: 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  e *db){.  db->fl
2740: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
2750: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
2760: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
2770: 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74  e memory data st
2780: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
2790: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
27a0: 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f  en.** Table.  No
27b0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
27c0: 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69  e to disk by thi
27d0: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
27e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
27f0: 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64  st deletes the d
2800: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
2810: 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69  It does not unli
2820: 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nk.** the table 
2830: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66  data structure f
2840: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
2850: 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  le.  Nor does it
2860: 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69   remove.** forei
2870: 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65  gn keys from the
2880: 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61   sqlite.aFKey ha
2890: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
28a0: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
28b0: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
28c0: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
28d0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
28e0: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
28f0: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
2900: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73  e..**.** Indices
2910: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2920: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75   the table are u
2930: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
2940: 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74   "db".** data st
2950: 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e  ructure if db!=N
2960: 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c  ULL.  If db==NUL
2970: 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63  L, indices attac
2980: 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  hed to.** the ta
2990: 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ble are deleted,
29a0: 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d   but it is assum
29b0: 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72  ed they have alr
29c0: 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c  eady been.** unl
29d0: 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  inked..*/.void s
29e0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
29f0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
2a00: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
2a10: 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a  int i;.  Index *
2a20: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
2a30: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
2a40: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
2a50: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
2a60: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  turn;..  /* Dele
2a70: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
2a80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2a90: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
2aa0: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
2ab0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
2ac0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
2ad0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
2ae0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2af0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
2b00: 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  ex->iDb==pTable-
2b10: 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d  >iDb || (pTable-
2b20: 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65  >iDb==0 && pInde
2b30: 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20  x->iDb==1) );.  
2b40: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
2b50: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
2b60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
2b70: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
2b80: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2b90: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
2ba0: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
2bb0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2bc0: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
2bd0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b  from the db->aFK
2be0: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
2bf0: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
2c00: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
2c10: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
2c20: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
2c30: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
2c40: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
2c50: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44  sert( pTable->iD
2c60: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
2c70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c80: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
2c90: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61  b[pTable->iDb].a
2ca0: 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  FKey,.          
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72   pFKey->zTo, str
2cd0: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
2ce0: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
2cf0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
2d00: 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  y);.  }..  /* De
2d10: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
2d20: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
2d30: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
2d40: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
2d50: 20 69 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75 6d   i++){.    Colum
2d60: 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 6c  n *pCol = &pTabl
2d70: 65 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  e->aCol[i];.    
2d80: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
2d90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
2da0: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44  iteFree(pCol->zD
2db0: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
2dc0: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
2dd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
2de0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  ree(pTable->zNam
2df0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
2e00: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
2e10: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 7a 43    if( pTable->zC
2e20: 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 73 71 6c  olAff ){.    sql
2e30: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
2e40: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 7d 0a 20 20  zColAff);.  }.  
2e50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2e60: 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  ete(pTable->pSel
2e70: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
2e80: 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f  ee(pTable);.}../
2e90: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
2ea0: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
2eb0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
2ec0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
2ed0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
2ee0: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
2ef0: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
2f00: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
2f10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2f20: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
2f30: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a  teTable(sqlite *
2f40: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
2f50: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
2f60: 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b  FKey *pF1, *pF2;
2f70: 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69 44  .  int i = p->iD
2f80: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
2f90: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
2fa0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2fb0: 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c  (&db->aDb[i].tbl
2fc0: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
2fd0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
2fe0: 2b 31 2c 30 29 3b 0a 20 20 61 73 73 65 72 74 28  +1,0);.  assert(
2ff0: 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64   pOld==0 || pOld
3000: 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70 46 31  ==p );.  for(pF1
3010: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20  =p->pFKey; pF1; 
3020: 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72  pF1=pF1->pNextFr
3030: 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  om){.    int nTo
3040: 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a   = strlen(pF1->z
3050: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70 46 32  To) + 1;.    pF2
3060: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
3070: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61  nd(&db->aDb[i].a
3080: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
3090: 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 46  nTo);.    if( pF
30a0: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
30b0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
30c0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46  t(&db->aDb[i].aF
30d0: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
30e0: 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  To, pF1->pNextTo
30f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
3100: 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26      while( pF2 &
3110: 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d  & pF2->pNextTo!=
3120: 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e  pF1 ){ pF2=pF2->
3130: 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20  pNextTo; }.     
3140: 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20   if( pF2 ){.    
3150: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
3160: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
3170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3180: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65   }.  sqlite3Dele
3190: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
31a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
31b0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
31c0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
31d0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
31e0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
31f0: 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74  en with any quot
3200: 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20  ations removed. 
3210: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
3220: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
3230: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
3240: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3250: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
3260: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
3270: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
3280: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  on..**.** Tokens
3290: 20 61 72 65 20 72 65 61 6c 6c 79 20 6a 75 73 74   are really just
32a0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
32b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
32c0: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
32d0: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
32e0: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
32f0: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
3300: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
3310: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
3320: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
3330: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
3340: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
3350: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
3360: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
3370: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
3380: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
3390: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
33a0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
33b0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
33c0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
33d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
33e0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
33f0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
3400: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
3410: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
3420: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
3430: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
3440: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
3450: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
3460: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
3470: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
3480: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
3490: 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  able(Vdbe *v, in
34a0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
34b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
34c0: 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
34d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
34e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
34f0: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
3500: 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65  _ROOT);.  sqlite
3510: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3520: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
3530: 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65  0, 5); /* sqlite
3540: 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63 6f  _master has 5 co
3550: 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  lumns */.}../*.*
3560: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61  * The token *pNa
3570: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
3580: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
3590: 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e  se (either "main
35a0: 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f  " or.** "temp" o
35b0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
35c0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
35d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
35e0: 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  rns the.** index
35f0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
3600: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
3610: 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68  b[], or -1 if th
3620: 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64  e named db .** d
3630: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
3640: 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28 73 71 6c  /.int findDb(sql
3650: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
3660: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
3670: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
3680: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3690: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 6e 3d 3d    if( pName->n==
36a0: 73 74 72 6c 65 6e 28 64 62 2d 3e 61 44 62 5b 69  strlen(db->aDb[i
36b0: 5d 2e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ].zName) && .   
36c0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
36d0: 74 72 4e 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  trNICmp(db->aDb[
36e0: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  i].zName, pName-
36f0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20 29 7b  >z, pName->n) ){
3700: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b  .      return i;
3710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3720: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn -1;.}../* Th
3730: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
3740: 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  or trigger name 
3750: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
3760: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
3770: 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61  kens.** pName1 a
3780: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
3790: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
37a0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
37b0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  , for example:.*
37c0: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
37d0: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
37e0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  .** .** Then pNa
37f0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
3800: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
3810: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
3820: 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68  er hand if.** th
3830: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
3840: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
3850: 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ied, i.e.:.**.**
3860: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
3870: 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  y(...);.**.** Th
3880: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
3890: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
38a0: 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a  ame2 is ""..**.*
38b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
38c0: 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61  ets the *ppUnqua
38d0: 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  l pointer to poi
38e0: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
38f0: 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e  (pName1 or.** pN
3900: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
3910: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
3920: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  d table name.  T
3930: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
3940: 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78  ** database "xxx
3950: 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  " is returned..*
3960: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  /.int sqlite3Two
3970: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
3980: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3990: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
39a0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
39b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
39c0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
39d0: 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20  /* The "xxx" in 
39e0: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
39f0: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  y" */.  Token *p
3a00: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
3a10: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
3a20: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
3a30: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
3a40: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
3a50: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
3a60: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
3a70: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
3a80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3a90: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3aa0: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
3ab0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
3ac0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3ad0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65  db;..  if( pName
3ae0: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  2 && pName2->n>0
3af0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3b00: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
3b10: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
3b20: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
3b30: 20 3d 20 66 69 6e 64 44 62 28 64 62 2c 20 70 4e   = findDb(db, pN
3b40: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
3b50: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
3b60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3b70: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
3b80: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
3b90: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
3ba0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3bb0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
3bc0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
3bd0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
3be0: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
3bf0: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
3c00: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
3c10: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
3c20: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
3c30: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
3c40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3c50: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
3c60: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
3c70: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
3c80: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
3c90: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
3ca0: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
3cb0: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
3cc0: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
3cd0: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
3ce0: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
3cf0: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
3d00: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
3d10: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
3d20: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
3d30: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
3d40: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
3d50: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
3d60: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
3d70: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
3d80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3d90: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
3da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
3db0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3dc0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
3dd0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
3de0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
3df0: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
3e00: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
3e10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3e20: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
3e30: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
3e40: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
3e50: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
3e60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3e70: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
3e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
3ea0: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
3eb0: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
3ec0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
3ed0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
3ee0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
3ef0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
3f00: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
3f10: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
3f20: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
3f30: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
3f40: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
3f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3f60: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
3f70: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
3f80: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
3f90: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
3fa0: 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53  name.  The.** pS
3fb0: 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  tart token is th
3fc0: 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61  e CREATE and pNa
3fd0: 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  me is the table 
3fe0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d  name.  The isTem
3ff0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
4000: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
4010: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
4020: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
4030: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
4040: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
4050: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4060: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
4070: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
4080: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
4090: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
40a0: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
40b0: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
40c0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
40d0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
40e0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
40f0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
4100: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
4110: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
4120: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
4130: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4140: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
4150: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
4160: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
4170: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
4180: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
4190: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
41a0: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
41b0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
41c0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
41d0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
41e0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
41f0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
4200: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
4210: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
4220: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
4230: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4240: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
4250: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4260: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4270: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4280: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
4290: 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a  "CREATE" token *
42a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
42b0: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
42c0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
42d0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
42e0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
42f0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
4300: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
4310: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
4320: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
4330: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
4340: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
4350: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
4360: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20  */.  int isView 
4370: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4380: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
4390: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
43a0: 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a  Table;.  Index *
43b0: 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pIdx;.  char *zN
43c0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  ame;.  sqlite *d
43d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
43e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
43f0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
4400: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4410: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
4420: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
4430: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
4440: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
4450: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
4460: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
4470: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
4480: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
4490: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
44a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
44b0: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
44c0: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
44d0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
44e0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
44f0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
4500: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
4510: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
4520: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
4530: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
4540: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4550: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4560: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4570: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
4580: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
4590: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
45a0: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
45b0: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
45c0: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
45d0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
45e0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
45f0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
4600: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
4610: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
4620: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
4630: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
4640: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
4650: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
4660: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
4670: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
4680: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
4690: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
46a0: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
46b0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
46c0: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
46d0: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
46e0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
46f0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
4700: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
4710: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
4720: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
4730: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
4740: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4750: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
4760: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
4770: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
4780: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
4790: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
47a0: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
47b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
47c0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
47d0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
47e0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
47f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4800: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
4810: 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
4820: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
4830: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
4840: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
4850: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4860: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
4870: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
4880: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4890: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
48a0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
48b0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
48c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
48d0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
48e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
48f0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
4900: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
4910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4920: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
4930: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
4940: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
4950: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
4960: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
4970: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
4980: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
4990: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
49a0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
49b0: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
49c0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
49d0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
49e0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
49f0: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
4a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4a10: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
4a20: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
4a30: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
4a40: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
4a50: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
4a60: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
4a70: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
4a80: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
4a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4aa0: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
4ab0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
4ac0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
4ad0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
4ae0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
4af0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
4b00: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
4b10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
4b20: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
4b30: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
4b40: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
4b50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4b60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
4b70: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
4b80: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
4b90: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65  re trying to cre
4ba0: 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
4bb0: 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65  table, make sure
4bc0: 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20   the Btree for. 
4bd0: 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70   ** holding temp
4be0: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73 20  orary tables is 
4bf0: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  open..  */.  if(
4c00: 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 61   isTemp && db->a
4c10: 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
4c20: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
4c30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
4c40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
4c50: 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d  tory(db, 0, 0, M
4c60: 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
4c70: 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
4c80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4c90: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
4ca0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4cb0: 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
4cc0: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
4cd0: 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
4ce0: 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
4cf0: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
4d00: 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
4d10: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4d20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4d30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
4d40: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
4d50: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
4d60: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
4d70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
4d80: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
4d90: 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
4da0: 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 1);.      if
4db0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4dc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4dd0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4de0: 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
4df0: 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
4e00: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
4e10: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
4e20: 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
4e30: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
4e40: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
4e50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
4e60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
4e70: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
4e80: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
4e90: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
4ea0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
4eb0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
4ec0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
4ed0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
4ee0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
4ef0: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
4f00: 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 70  t does..  */.  p
4f10: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
4f20: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
4f30: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
4f40: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  .zName);.  if( p
4f50: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
4f60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4f70: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
4f80: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
4f90: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  pName);.    sqli
4fa0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4fb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4fc0: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
4fd0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
4fe0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
4ff0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  &&.          (pI
5000: 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20 21 64  dx->iDb==0 || !d
5010: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
5020: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5030: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
5040: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
5050: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
5060: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  ", zName);.    s
5070: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
5080: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5090: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
50a0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
50b0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
50c0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
50d0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
50e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
50f0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
5110: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
5120: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
5130: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
5140: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
5150: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
5160: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
5170: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
5180: 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78    pTable->pIndex
5190: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
51a0: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28  iDb = iDb;.  if(
51b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
51c0: 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65  le ) sqlite3Dele
51d0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72  teTable(db, pPar
51e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a  se->pNewTable);.
51f0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
5200: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
5210: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
5220: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
5230: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
5240: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
5250: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
5260: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
5270: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
5280: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
5290: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
52a0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
52b0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
52c0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
52d0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
52e0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
52f0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
5300: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
5310: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
5320: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
5330: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
5340: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
5350: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5360: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
5370: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
5380: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
5390: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
53a0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
53b0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
53c0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
53d0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
53e0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
53f0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5400: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
5410: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5420: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5430: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 2f 2a 20  0, iDb);.    /* 
5440: 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e 65 77  Every time a new
5450: 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65   table is create
5460: 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72 6d 61  d the file-forma
5470: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 6e 63  t.    ** and enc
5480: 6f 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c 75 65  oding meta-value
5490: 73 20 61 72 65 20 73 65 74 20 69 6e 20 74 68 65  s are set in the
54a0: 20 64 61 74 61 62 61 73 65 2c 20 69 6e 0a 20 20   database, in.  
54b0: 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 69    ** case this i
54c0: 73 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  s the first tabl
54d0: 65 20 63 72 65 61 74 65 64 2e 0a 20 20 20 20 2a  e created..    *
54e0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
54f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5500: 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66  eger, db->file_f
5510: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
5520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5530: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
5540: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71   iDb, 1);.    sq
5550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5560: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
5570: 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73  ->enc, 0);.    s
5580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5590: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
55a0: 20 69 44 62 2c 20 34 29 3b 0a 0a 20 20 20 20 73   iDb, 4);..    s
55b0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
55c0: 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20  Table(v, iDb);. 
55d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
55e0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
55f0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  no, 0, 0);.    s
5600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5610: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
5620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
5640: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
5650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5660: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
5670: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  y, 0, 0);.  }.}.
5680: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
5690: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
56a0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
56b0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
56c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
56d0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
56e0: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
56f0: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
5700: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
5710: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5720: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
5730: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
5740: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
5750: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
5760: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
5770: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5780: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
5790: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
57a0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
57b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
57c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
57d0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
57e0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
57f0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
5800: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
5810: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
5820: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
5830: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5840: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
5850: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
5860: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5870: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
5880: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5890: 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  Cmp(z, p->aCol[i
58a0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
58b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
58c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
58d0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
58e0: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
58f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5900: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
5910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5920: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
5930: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
5940: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
5950: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
5960: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
5970: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
5980: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
5990: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
59b0: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
59c0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
59d0: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
59e0: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
59f0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
5a00: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
5a10: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
5a20: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
5a30: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
5a40: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
5a50: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
5a60: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
5a70: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
5a80: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
5a90: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
5aa0: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
5ab0: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
5ac0: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
5ad0: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
5ae0: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
5af0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
5b00: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70  _NONE;.  pCol->p
5b10: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
5b20: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
5b30: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
5b40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5b50: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
5b60: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
5b70: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
5b80: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
5b90: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5ba0: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
5bb0: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
5bc0: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
5bd0: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
5be0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5bf0: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
5c00: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
5c10: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5c20: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
5c30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
5c40: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
5c50: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
5c60: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
5c70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
5c80: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5c90: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5ca0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5cb0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
5cc0: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
5cd0: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
5ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5cf0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5d00: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
5d10: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
5d20: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
5d30: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
5d40: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
5d50: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
5d60: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
5d70: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
5d80: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
5d90: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
5da0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
5db0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
5dc0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5dd0: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
5de0: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
5df0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
5e00: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
5e10: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
5e20: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
5e30: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
5e40: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
5e50: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
5e60: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
5e70: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
5e80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
5e90: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
5ea0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
5eb0: 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a  *pFirst, Token *
5ec0: 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20  pLast){.  Table 
5ed0: 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  *p;.  int i, j;.
5ee0: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
5ef0: 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75  *z, **pz;.  Colu
5f00: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
5f10: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5f20: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5f30: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
5f40: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
5f50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
5f60: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
5f70: 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54    pz = &pCol->zT
5f80: 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74  ype;.  n = pLast
5f90: 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73 74  ->n + Addr(pLast
5fa0: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69 72  ->z) - Addr(pFir
5fb0: 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  st->z);.  sqlite
5fc0: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
5fd0: 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29  pFirst->z, n, 0)
5fe0: 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69  ;.  z = *pz;.  i
5ff0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
6000: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
6010: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
6020: 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  nt c = z[i];.   
6030: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
6040: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6050: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  z[j++] = c;.  }.
6060: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43    z[j] = 0;.  pC
6070: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
6080: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
6090: 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  pe(z, n);.}../*.
60a0: 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b  ** The given tok
60b0: 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  en is the defaul
60c0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
60d0: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
60e0: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
6100: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
6110: 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20   If "minusFlag" 
6120: 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d  is true, it.** m
6130: 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  eans the value t
6140: 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65  oken was precede
6150: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
6160: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
6170: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6180: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
6190: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
61a0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
61b0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
61c0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
61d0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
61e0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
61f0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
6200: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
6210: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
6220: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
6230: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
6240: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6250: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6260: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6270: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
6280: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
6290: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
62a0: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
62b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
62c0: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d  etNString(pz, "-
62d0: 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70  ", 1, pVal->z, p
62e0: 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65  Val->n, 0);.  }e
62f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6300: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
6310: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
6320: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
6330: 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a  e3Dequote(*pz);.
6340: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
6350: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
6360: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
6370: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
6380: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
6390: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
63a0: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
63b0: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
63c0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
63d0: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
63e0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
63f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
6400: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
6410: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
6420: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
6430: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
6440: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
6450: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
6460: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
6470: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
6480: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
6490: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
64a0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
64b0: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
64c0: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
64d0: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
64e0: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
64f0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
6500: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
6510: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
6520: 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63 65  e row id.  (Exce
6530: 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61  ption:.** For ba
6540: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
6550: 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
6560: 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20 6e   databases, do n
6570: 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66  ot do this.** if
6580: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
6590: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
65a0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 29  is less than 1.)
65b0: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
65c0: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
65d0: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
65e0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
65f0: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
6600: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
6610: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
6620: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
6630: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
6640: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
6650: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
6660: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
6670: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
6680: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
6690: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
66a0: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
66b0: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
66c0: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
66d0: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
66e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
66f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
6700: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72  ddPrimaryKey(Par
6710: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6720: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
6730: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
6740: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
6750: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
6760: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
6770: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
6780: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
6790: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
67a0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
67b0: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
67c0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
67d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
67e0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
67f0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
6800: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
6810: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
6820: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
6830: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
6840: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
6850: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
6860: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
6870: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
6880: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
6890: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
68a0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
68b0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
68c0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
68d0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
68e0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
68f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
6900: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
6910: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6920: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
6930: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
6940: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
6950: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6960: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6970: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
6980: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20  ol<pTab->nCol ) 
6990: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
69a0: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
69b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
69c0: 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69  ist->nExpr>1 ) i
69d0: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  Col = -1;.  }.  
69e0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
69f0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
6a00: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  {.    zType = pT
6a10: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
6a20: 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Type;.  }.  if( 
6a30: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33  zType && sqlite3
6a40: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
6a50: 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a  INTEGER")==0 ){.
6a60: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
6a70: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
6a80: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72  ->keyConf = onEr
6a90: 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ror;.  }else{.  
6aa0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
6ab0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
6ac0: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
6ad0: 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rror, 0, 0);.   
6ae0: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
6af0: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
6b00: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
6b10: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
6b20: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
6b30: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
6b40: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
6b50: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
6b60: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
6b70: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
6b80: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
6b90: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6ba0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
6bb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
6bd0: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
6be0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64   Table *p;.  Ind
6bf0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c  ex *pIdx;.  Coll
6c00: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
6c10: 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  t i;..  if( (p =
6c20: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6c30: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
6c40: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
6c50: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
6c60: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
6c70: 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c  q(pParse, zType,
6c80: 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43   nType);.  p->aC
6c90: 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43  ol[i].pColl = pC
6ca0: 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  oll;..  /* If th
6cb0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
6cc0: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
6cd0: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
6ce0: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a  ATE <type>",.  *
6cf0: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
6d00: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
6d10: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
6d20: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
6d30: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
6d40: 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43  ype was added. C
6d50: 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69  orrect this if i
6d60: 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  t is the case.. 
6d70: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d   */.  for(pIdx =
6d80: 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78   p->pIndex; pIdx
6d90: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
6da0: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
6db0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
6dc0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  1 );.    if( pId
6dd0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
6de0: 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  i ) pIdx->keyInf
6df0: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f  o.aColl[0] = pCo
6e00: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll;.  }.}../*.**
6e10: 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75   Locate and retu
6e20: 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  rn an entry from
6e30: 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71   the db.aCollSeq
6e40: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
6e50: 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65  the entry.** spe
6e60: 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20  cified by zName 
6e70: 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74  and nName is not
6e80: 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d   found and param
6e90: 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69 73  eter 'create' is
6ea0: 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63  .** true, then c
6eb0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  reate a new entr
6ec0: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  y. Otherwise ret
6ed0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
6ee0: 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f  Each pointer sto
6ef0: 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
6f00: 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  e3.aCollSeq hash
6f10: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
6f20: 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74  an.** array of t
6f30: 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72  hree CollSeq str
6f40: 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69 72  uctures. The fir
6f50: 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74  st is the collat
6f60: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
6f70: 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20 55  prefferred for U
6f80: 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64  TF-8, the second
6f90: 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74   UTF-16le, and t
6fa0: 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36 62  he third UTF-16b
6fb0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20  e..**.** Stored 
6fc0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
6fd0: 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c  r the three coll
6fe0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
6ff0: 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  is a copy of.** 
7000: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7010: 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70  quence name. A p
7020: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
7030: 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20  tring is stored 
7040: 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61  in.** each colla
7050: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74  tion sequence st
7060: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
7070: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e  ic CollSeq * fin
7080: 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20  dCollSeqEntry(. 
7090: 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20 63   sqlite *db,.  c
70a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
70b0: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
70c0: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
70d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
70e0: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
70f0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
7100: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
7110: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
7120: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
7130: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
7140: 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20  .  if( 0==pColl 
7150: 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20  && create ){.   
7160: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d   pColl = sqliteM
7170: 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28  alloc( 3*sizeof(
7180: 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20  *pColl) + nName 
7190: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
71a0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
71b0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[0].zName = (
71c0: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
71d0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e  .      pColl[0].
71e0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
71f0: 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31  8;.      pColl[1
7200: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
7210: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
7220: 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d    pColl[1].enc =
7230: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b   SQLITE_UTF16LE;
7240: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e  .      pColl[2].
7250: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
7260: 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20  pColl[3];.      
7270: 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53  pColl[2].enc = S
7280: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
7290: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
72a0: 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[0].zName, zNam
72b0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, nName);.     
72c0: 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b   pColl[0].zName[
72d0: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
72e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
72f0: 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ert(&db->aCollSe
7300: 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d  q, pColl[0].zNam
7310: 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29  e, nName, pColl)
7320: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7330: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
7340: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
7350: 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  Name points to a
7360: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73   UTF-8 encoded s
7370: 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65  tring nName byte
7380: 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72  s long..** Retur
7390: 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70  n the CollSeq* p
73a0: 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20 63  ointer for the c
73b0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
73c0: 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a  e named zName.**
73d0: 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64 69 6e   for the encodin
73e0: 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74 68 65  g 'enc' from the
73f0: 20 64 61 74 61 62 61 73 65 20 27 64 62 27 2e 0a   database 'db'..
7400: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e 74  **.** If the ent
7410: 72 79 20 73 70 65 63 69 66 69 65 64 20 69 73 20  ry specified is 
7420: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 27 63  not found and 'c
7430: 72 65 61 74 65 27 20 69 73 20 74 72 75 65 2c 20  reate' is true, 
7440: 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a  then create a.**
7450: 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f 74 68   new entry.  Oth
7460: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
7470: 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  LL..*/.CollSeq *
7480: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
7490: 65 71 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  eq(.  sqlite *db
74a0: 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f  ,.  u8 enc,.  co
74b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
74c0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20  .  int nName,.  
74d0: 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20  int create.){.  
74e0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
74f0: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
7500: 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  y(db, zName, nNa
7510: 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a 20 20 69  me, create);.  i
7520: 66 28 20 70 43 6f 6c 6c 20 29 20 73 77 69 74 63  f( pColl ) switc
7530: 68 28 20 65 6e 63 20 29 7b 0a 20 20 20 20 63 61  h( enc ){.    ca
7540: 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a  se SQLITE_UTF8:.
7550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7560: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
7570: 31 36 4c 45 3a 0a 20 20 20 20 20 20 70 43 6f 6c  16LE:.      pCol
7580: 6c 20 3d 20 26 70 43 6f 6c 6c 5b 31 5d 3b 0a 20  l = &pColl[1];. 
7590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
75a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
75b0: 36 42 45 3a 0a 20 20 20 20 20 20 70 43 6f 6c 6c  6BE:.      pColl
75c0: 20 3d 20 26 70 43 6f 6c 6c 5b 32 5d 3b 0a 20 20   = &pColl[2];.  
75d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
75e0: 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 61  efault: .      a
75f0: 73 73 65 72 74 28 21 22 43 61 6e 6e 6f 74 20 68  ssert(!"Cannot h
7600: 61 70 70 65 6e 22 29 3b 0a 20 20 7d 0a 20 20 72  appen");.  }.  r
7610: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
7620: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
7630: 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64   'collation need
7640: 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ed' callback to 
7650: 72 65 71 75 65 73 74 20 61 20 63 6f 6c 6c 61 74  request a collat
7660: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
7670: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7680: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66  text encoding of
7690: 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e   name zName, len
76a0: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66  gth nName..** If
76b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
76c0: 65 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  equence.*/.stati
76d0: 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e  c void callCollN
76e0: 65 65 64 65 64 28 73 71 6c 69 74 65 20 2a 64 62  eeded(sqlite *db
76f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
7700: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
7710: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
7720: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21  xCollNeeded || !
7730: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
7740: 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  6 );.  if( nName
7750: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
7760: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  len(zName);.  if
7770: 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65  ( db->xCollNeede
7780: 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  d ){.    char *z
7790: 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74  External = sqlit
77a0: 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20  eStrNDup(zName, 
77b0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
77c0: 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74  !zExternal ) ret
77d0: 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f  urn;.    db->xCo
77e0: 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70 43 6f  llNeeded(db->pCo
77f0: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c  llNeededArg, db,
7800: 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a   (int)db->enc, z
7810: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73  External);.    s
7820: 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74 65 72  qliteFree(zExter
7830: 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nal);.  }.  if( 
7840: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
7850: 36 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  6 ){.    char co
7860: 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a  nst *zExternal;.
7870: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
7880: 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  e *pTmp = sqlite
7890: 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
78a0: 75 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ue(db);.    sqli
78b0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
78c0: 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  Tmp, -1, zName, 
78d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
78e0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
78f0: 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c   zExternal = sql
7900: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 54  ite3ValueText(pT
7910: 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  mp, SQLITE_UTF16
7920: 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28  NATIVE);.    if(
7930: 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65   !zExternal ) re
7940: 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43  turn;.    db->xC
7950: 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e  ollNeeded16(db->
7960: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
7970: 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63  db, (int)db->enc
7980: 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20  , zExternal);.  
7990: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
79a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
79b0: 64 20 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  d if the collati
79c0: 6f 6e 20 66 61 63 74 6f 72 79 20 66 61 69 6c 73  on factory fails
79d0: 20 74 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a   to deliver a.**
79e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
79f0: 69 6f 6e 20 69 6e 20 74 68 65 20 62 65 73 74 20  ion in the best 
7a00: 65 6e 63 6f 64 69 6e 67 20 62 75 74 20 74 68 65  encoding but the
7a10: 72 65 20 6d 61 79 20 62 65 20 6f 74 68 65 72 20  re may be other 
7a20: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74  versions.** of t
7a30: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  his collation fu
7a40: 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65  nction (for othe
7a50: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  r text encodings
7a60: 29 20 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65  ) available. Use
7a70: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65   one.** of these
7a80: 20 69 6e 73 74 65 61 64 20 69 66 20 74 68 65 79   instead if they
7a90: 20 65 78 69 73 74 2e 20 41 76 6f 69 64 20 61 20   exist. Avoid a 
7aa0: 55 54 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36  UTF-8 <-> UTF-16
7ab0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a   conversion if.*
7ac0: 2a 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73  * possible..*/.s
7ad0: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43  tatic int synthC
7ae0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
7af0: 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70  arse, CollSeq *p
7b00: 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  Coll){.  CollSeq
7b10: 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72   *pColl2;.  char
7b20: 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   *z = pColl->zNa
7b30: 6d 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  me;.  int n = st
7b40: 72 6c 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74  rlen(z);.  sqlit
7b50: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
7b60: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  db;.  int i;.  s
7b70: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
7b80: 45 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45  Enc[] = { SQLITE
7b90: 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45  _UTF16BE, SQLITE
7ba0: 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45  _UTF16LE, SQLITE
7bb0: 5f 55 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69  _UTF8 };.  for(i
7bc0: 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20  =0; i<3; i++){. 
7bd0: 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69     pColl2 = sqli
7be0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
7bf0: 62 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e  b, aEnc[i], z, n
7c00: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
7c10: 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b  oll2->xCmp!=0 ){
7c20: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43  .      memcpy(pC
7c30: 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a  oll, pColl2, siz
7c40: 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20  eof(CollSeq));. 
7c50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7c60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
7c70: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
7c80: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Err==0 ){.    sq
7c90: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
7ca0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
7cb0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
7cc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 22  tion sequence: "
7cd0: 2c 20 0a 20 20 20 20 20 20 20 20 2d 31 2c 20 7a  , .        -1, z
7ce0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , n, 0);.  }.  p
7cf0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7d00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
7d10: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
7d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7d30: 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61  alled on a colla
7d40: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65  tion sequence be
7d50: 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 20  fore it is used 
7d60: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74  to.** check that
7d70: 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20   it is defined. 
7d80: 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c  An undefined col
7d90: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
7da0: 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61  exists when.** a
7db0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61   database is loa
7dc0: 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ded that contain
7dd0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
7de0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7df0: 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ces.** that have
7e00: 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65   not been define
7e10: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65  d by sqlite3_cre
7e20: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20  ate_collation() 
7e30: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  etc..**.** If re
7e40: 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
7e50: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27  tine calls the '
7e60: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
7e70: 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a  ' callback to.**
7e80: 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69 6e   request a defin
7e90: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ition of the col
7ea0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
7eb0: 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74   If this doesn't
7ec0: 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71   work, .** an eq
7ed0: 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69  uivalent collati
7ee0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  ng sequence that
7ef0: 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e 63   uses a text enc
7f00: 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  oding different.
7f10: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ** from the main
7f20: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75 62   database is sub
7f30: 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65  stituted, if one
7f40: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
7f50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
7f60: 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ckCollSeq(Parse 
7f70: 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71  *pParse, CollSeq
7f80: 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20   *pColl){.  if( 
7f90: 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d  pColl && !pColl-
7fa0: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20  >xCmp ){.    /* 
7fb0: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
7fc0: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
7fd0: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
7fe0: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
7ff0: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
8000: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8010: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
8020: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
8030: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
8040: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
8050: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
8060: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73   pColl->zName, s
8070: 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  trlen(pColl->zNa
8080: 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  me));.    if( !p
8090: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79  Coll->xCmp && sy
80a0: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
80b0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
80c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
80d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
80e0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
80f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
8100: 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b  all sqlite3Check
8110: 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c  CollSeq() for al
8120: 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  l collating sequ
8130: 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65  ences in an inde
8140: 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  x,.** in order t
8150: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
8160: 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  l the necessary 
8170: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8180: 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65  ces are.** loade
8190: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
81a0: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
81b0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
81c0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
81d0: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
81e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
81f0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
8200: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
8210: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68     if( sqlite3Ch
8220: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
8230: 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  e, pIdx->keyInfo
8240: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20  .aColl[i]) ){.  
8250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8260: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
8270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
8280: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
82a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
82b0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
82c0: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
82d0: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
82e0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
82f0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
8300: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
8310: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
8320: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
8330: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8340: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
8350: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
8360: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
8370: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
8380: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
8390: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
83a0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
83b0: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
83c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
83d0: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
83e0: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
83f0: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
8400: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
8410: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
8420: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
8430: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
8440: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
8450: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
8460: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
8470: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
8480: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
8490: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
84a0: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
84b0: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
84c0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
84d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
84e0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
84f0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53  pParse..*/.CollS
8500: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
8510: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
8520: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
8530: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
8540: 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20  Name){.  u8 enc 
8550: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
8560: 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  c;.  u8 initbusy
8570: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69   = pParse->db->i
8580: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
8590: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
85a0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
85b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c  pParse->db, enc,
85c0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
85d0: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
85e0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
85f0: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
8600: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20  xCmp) ){.    /* 
8610: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
8620: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
8630: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
8640: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
8650: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
8660: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8670: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
8680: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
8690: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
86a0: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
86b0: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
86c0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
86d0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
86e0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70  te3FindCollSeq(p
86f0: 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20  Parse->db, enc, 
8700: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29  zName, nName, 0)
8710: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
8720: 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  && !pColl->xCmp 
8730: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
8740: 65 20 6d 61 79 20 62 65 20 61 20 76 65 72 73 69  e may be a versi
8750: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  on of the collat
8760: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
8770: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
8780: 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20   ** translation 
8790: 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67  between encoding
87a0: 73 2e 20 53 65 61 72 63 68 20 66 6f 72 20 69 74  s. Search for it
87b0: 20 77 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53   with synthCollS
87c0: 65 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eq()..      */. 
87d0: 20 20 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f       if( synthCo
87e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
87f0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
8800: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
8810: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
8820: 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73  * If nothing has
8830: 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69   been found, wri
8840: 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  te the error mes
8850: 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65  sage into pParse
8860: 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62   */.  if( !initb
8870: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
8880: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
8890: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
88a0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
88b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
88c0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
88d0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
88e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
88f0: 6e 63 65 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20  nce: ", -1,.    
8900: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 6e 4e 61        zName, nNa
8910: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
8920: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
8930: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b  ;.    pColl = 0;
8940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
8950: 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  oll;.}..../*.** 
8960: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
8970: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
8980: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
8990: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
89a0: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
89b0: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68  nity type..*/.ch
89c0: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
89d0: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
89e0: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
89f0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69  ype){.  int n, i
8a00: 3b 0a 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20  ;.  struct {.   
8a10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
8a20: 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20  b;  /* Keywords 
8a30: 73 75 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61  substring to sea
8a40: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63  rch for */.    c
8a50: 68 61 72 20 6e 53 75 62 3b 20 20 20 20 20 20 20  har nSub;       
8a60: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a    /* length of z
8a70: 53 75 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  Sub */.    char 
8a80: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a  affinity;     /*
8a90: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74   Affinity to ret
8aa0: 75 72 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65  urn if it matche
8ab0: 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69  s */.  } substri
8ac0: 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22  ngs[] = {.    {"
8ad0: 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45  INT",  3, SQLITE
8ae0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20  _AFF_INTEGER},. 
8af0: 20 20 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53     {"CHAR", 4, S
8b00: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
8b10: 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c  .    {"CLOB", 4,
8b20: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8b30: 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20  },.    {"TEXT", 
8b40: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
8b50: 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22  XT},.    {"BLOB"
8b60: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
8b70: 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69  NONE},.  };..  i
8b80: 66 28 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( nType==0 ){. 
8b90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8ba0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  _AFF_NONE;.  }. 
8bb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8bc0: 6f 66 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73  of(substrings)/s
8bd0: 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73  izeof(substrings
8be0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
8bf0: 69 6e 74 20 63 31 20 3d 20 73 75 62 73 74 72 69  int c1 = substri
8c00: 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a  ngs[i].zSub[0];.
8c10: 20 20 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c      int c2 = tol
8c20: 6f 77 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e  ower(c1);.    in
8c30: 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20  t limit = nType 
8c40: 2d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  - substrings[i].
8c50: 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nSub;.    const 
8c60: 63 68 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72  char *z = substr
8c70: 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20  ings[i].zSub;.  
8c80: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69    for(n=0; n<=li
8c90: 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  mit; n++){.     
8ca0: 20 69 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e   int c = zType[n
8cb0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d  ];.      if( (c=
8cc0: 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20  =c1 || c==c2).  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d             && 0=
8ce0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
8cf0: 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73  (&zType[n], z, s
8d00: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75  ubstrings[i].nSu
8d10: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
8d20: 74 75 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b  turn substrings[
8d30: 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  i].affinity;.   
8d40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
8d60: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f  FF_NUMERIC;.}../
8d70: 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74  *.** Come up wit
8d80: 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76  h a new random v
8d90: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63 68  alue for the sch
8da0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b  ema cookie.  Mak
8db0: 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65  e sure.** the ne
8dc0: 77 20 76 61 6c 75 65 20 69 73 20 64 69 66 66 65  w value is diffe
8dd0: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c  rent from the ol
8de0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  d..**.** The sch
8df0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
8e00: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
8e10: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
8e20: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
8e30: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
8e40: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
8e50: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
8e60: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
8e70: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
8e80: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
8e90: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
8ea0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
8eb0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
8ec0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
8ed0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
8ee0: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
8ef0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
8f00: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
8f10: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
8f20: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
8f30: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
8f40: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
8f50: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
8f60: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
8f70: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
8f80: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
8f90: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
8fa0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
8fb0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
8fc0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
8fd0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
8fe0: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
8ff0: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
9000: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
9010: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
9020: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
9030: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
9040: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
9050: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
9060: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
9070: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
9080: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
9090: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 56 64  e(sqlite *db, Vd
90a0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b  be *v, int iDb){
90b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
90c0: 20 72 3b 0a 20 20 69 6e 74 20 2a 70 53 63 68 65   r;.  int *pSche
90d0: 6d 61 43 6f 6f 6b 69 65 20 3d 20 26 28 64 62 2d  maCookie = &(db-
90e0: 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
90f0: 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20 20 73 71 6c  _cookie);..  sql
9100: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31  ite3Randomness(1
9110: 2c 20 26 72 29 3b 0a 20 20 2a 70 53 63 68 65 6d  , &r);.  *pSchem
9120: 61 43 6f 6f 6b 69 65 20 3d 20 2a 70 53 63 68 65  aCookie = *pSche
9130: 6d 61 43 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31  maCookie + r + 1
9140: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
9150: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
9160: 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  anges;.  sqlite3
9170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9180: 49 6e 74 65 67 65 72 2c 20 2a 70 53 63 68 65 6d  Integer, *pSchem
9190: 61 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 73  aCookie, 0);.  s
91a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
91b0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
91c0: 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a   iDb, 0);.}../*.
91d0: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
91e0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
91f0: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
9200: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
9210: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
9220: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
9230: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
9240: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
9250: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
9260: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
9270: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
9280: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
9290: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
92a0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  ){.  int n;.  in
92b0: 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b  t needQuote = 0;
92c0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
92d0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
92e0: 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e  f( *z=='\'' ){ n
92f0: 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b  ++; needQuote=1;
9300: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9310: 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b  n + needQuote*2;
9320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
9330: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  an identifier on
9340: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9350: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20  e given string. 
9360: 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68   Add.** quote ch
9370: 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64  aracters as need
9380: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
9390: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
93a0: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
93b0: 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20  char *zIdent){. 
93c0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
93d0: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
93e0: 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  x;.  for(j=0; zI
93f0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
9400: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
9410: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
9420: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
9430: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
9440: 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b  Quote =  zIdent[
9450: 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74  j]!=0 || isdigit
9460: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
9480: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
9490: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
94a0: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
94b0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
94c0: 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d  = '\'';.  for(j=
94d0: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
94e0: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
94f0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
9500: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
9510: 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  \'' ) z[i++] = '
9520: 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  \'';.  }.  if( n
9530: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
9540: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d  ] = '\'';.  z[i]
9550: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
9560: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
9570: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
9580: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
9590: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
95a0: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
95b0: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
95c0: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
95d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
95e0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
95f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
9600: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
9610: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
9620: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
9630: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
9640: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
9650: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
9660: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
9670: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
9680: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
9690: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    n = 0;.  for(i
96a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
96b0: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
96c0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f  entLength(p->aCo
96d0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
96e0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   if( p->aCol[i].
96f0: 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6e  zType ){.      n
9700: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 70 2d 3e 61   += (strlen(p->a
9710: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 20 2b 20  Col[i].zType) + 
9720: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
9730: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
9740: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
9750: 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<40 ){.    zS
9760: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
9770: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
9780: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
9790: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
97a0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
97b0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
97c0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
97d0: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
97e0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
97f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
9800: 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  w( n );.  if( zS
9810: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
9820: 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  0;.  strcpy(zStm
9830: 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22  t, p->iDb==1 ? "
9840: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
9850: 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41  E " : "CREATE TA
9860: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
9870: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
9880: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
9890: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
98a0: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
98b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
98c0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
98d0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
98e0: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
98f0: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
9900: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
9910: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
9920: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
9930: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
9940: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  e);.    if( p->a
9950: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 29 7b 0a  Col[i].zType ){.
9960: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
9970: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74   = ' ';.      st
9980: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
9990: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  p->aCol[i].zType
99a0: 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74  );.      k += st
99b0: 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  rlen(p->aCol[i].
99c0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zType);.    }.  
99d0: 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d  }.  strcpy(&zStm
99e0: 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  t[k], zEnd);.  r
99f0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
9a00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9a10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
9a20: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
9a30: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
9a40: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
9a50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9a60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
9a70: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
9a80: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
9a90: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
9aa0: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
9ab0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
9ac0: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
9ad0: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
9ae0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
9af0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
9b00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
9b10: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
9b20: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
9b30: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
9b40: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
9b50: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
9b60: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9b70: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
9b80: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
9b90: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
9ba0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
9bb0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
9bc0: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
9bd0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
9be0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
9bf0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
9c00: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
9c10: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
9c20: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
9c30: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
9c40: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
9c50: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
9c60: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
9c70: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
9c80: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
9c90: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
9ca0: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
9cb0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
9cc0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
9cd0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
9ce0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
9cf0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
9d00: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
9d10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
9d20: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
9d30: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
9d40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
9d50: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
9d60: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
9d70: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
9d80: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
9d90: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
9da0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9db0: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
9dc0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
9dd0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
9de0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
9df0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
9e00: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
9e10: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
9e20: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
9e30: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
9e40: 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70   return;.  p = p
9e50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9e60: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
9e70: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
9e80: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
9e90: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
9ea0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
9eb0: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
9ec0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
9ed0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
9ee0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
9ef0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
9f00: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
9f10: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
9f20: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
9f30: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
9f40: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
9f50: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
9f60: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
9f70: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
9f80: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
9f90: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
9fa0: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
9fb0: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
9fc0: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
9fd0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
9fe0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
9ff0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ).  */.  if( db-
a000: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
a010: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
a020: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
a030: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
a040: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
a050: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
a060: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
a070: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
a080: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
a090: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
a0a0: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
a0b0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
a0c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
a0d0: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
a0e0: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
a0f0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
a100: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
a110: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
a120: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
a130: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
a140: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
a150: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
a160: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
a170: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
a180: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
a190: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
a1a0: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20  be *v;..    v = 
a1b0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a1c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a1d0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
a1e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
a1f0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
a200: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
a210: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
a220: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a230: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20  CreateTable, 0, 
a240: 70 2d 3e 69 44 62 2c 20 28 63 68 61 72 2a 29 26  p->iDb, (char*)&
a250: 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e  p->tnum, P3_POIN
a260: 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TER);.    }else{
a270: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
a280: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a290: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a2a0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
a2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
a2c0: 75 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 73 71 6c  um = 0;..    sql
a2d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a2e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
a2f0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
a300: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
a310: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
a320: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
a330: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
a340: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
a350: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
a360: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
a370: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
a380: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
a390: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
a3a0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
a3b0: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
a3c0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
a3d0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
a3e0: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
a3f0: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
a400: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
a410: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
a420: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
a430: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
a440: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
a450: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
a460: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a470: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
a480: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
a490: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a4a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
a4b0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
a4c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a4d0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
a4e0: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
a4f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a500: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
a510: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
a520: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
a530: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
a540: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
a550: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62  pSelect, SRT_Tab
a560: 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20  le, 1, 0, 0, 0, 
a570: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a580: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a590: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
a5a0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a5b0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
a5c0: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
a5d0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
a5e0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
a5f0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
a600: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
a610: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a620: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a630: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
a640: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
a650: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
a660: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
a670: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
a680: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
a690: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
a6a0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
a6b0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
a6c0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
a6d0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
a6e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
a6f0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
a700: 72 54 61 62 6c 65 28 76 2c 20 70 2d 3e 69 44 62  rTable(v, p->iDb
a710: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
a720: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
a730: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70  ing8, 0, 0, p->p
a740: 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65  Select==0?"table
a750: 22 3a 22 76 69 65 77 22 2c 50 33 5f 53 54 41 54  ":"view",P3_STAT
a760: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
a770: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
a780: 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e  ring8, 0, 0, p->
a790: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
a7a0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a7b0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
a7c0: 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  0, p->zName, 0);
a7d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a7e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
a7f0: 2c 20 33 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 3, 0);..    if
a800: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
a810: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65     char *z = cre
a820: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b  ateTableStmt(p);
a830: 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73  .      n = z ? s
a840: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
a850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a860: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a870: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
a880: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a890: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e  geP3(v, -1, z, n
a8a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
a8b0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(z);.    }els
a8c0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  e{.      if( p->
a8d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
a8e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a8f0: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
a900: 20 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20 56   0, 0, "CREATE V
a910: 49 45 57 20 22 2c 20 50 33 5f 53 54 41 54 49 43  IEW ", P3_STATIC
a920: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a940: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
a950: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45  ing8, 0, 0, "CRE
a960: 41 54 45 20 54 41 42 4c 45 20 22 2c 20 50 33 5f  ATE TABLE ", P3_
a970: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
a980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a990: 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  End!=0 );.      
a9a0: 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a  n = Addr(pEnd->z
a9b0: 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d  ) - Addr(pParse-
a9c0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b  >sNameToken.z) +
a9d0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
a9e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a9f0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
aa00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa10: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
aa20: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
aa30: 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20  oken.z, n);.    
aa40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
aa50: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 38  Op(v, OP_Concat8
aa60: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 2, 0);.    }. 
aa70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
aa80: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
aa90: 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74  rd, 5, 0, "tttit
aaa0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
aab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aac0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
aad0: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
aae0: 69 66 28 20 70 2d 3e 69 44 62 21 3d 31 20 29 7b  if( p->iDb!=1 ){
aaf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
ab00: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
ab10: 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d  , p->iDb);.    }
ab20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
ab40: 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 73  e, 0, 0);..    s
ab50: 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
ab60: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
ab70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
ab80: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
ab90: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
aba0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
abb0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
abc0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
abd0: 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73  lain==0 && pPars
abe0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
abf0: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
ac00: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a     FKey *pFKey;.
ac10: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
ac20: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
ac30: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62  ->aDb[p->iDb].tb
ac40: 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  lHash, .        
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74      p->zName, st
ac70: 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31  rlen(p->zName)+1
ac80: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
ac90: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
aca0: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
acb0: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
acc0: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
acd0: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
ace0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
acf0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46      }.    for(pF
ad00: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
ad10: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
ad20: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
ad30: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
ad40: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
ad50: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
ad60: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
ad70: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
ad80: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
ad90: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
ada0: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
adb0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
adc0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
add0: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
ade0: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
adf0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
ae00: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
ae10: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
ae20: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
ae30: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
ae40: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a  nChanges;.  }.}.
ae50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
ae60: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
ae70: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
ae80: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
ae90: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
aea0: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
aeb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
aec0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
aed0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
aee0: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
aef0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
af00: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
af10: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
af20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
af30: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
af40: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
af50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
af60: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
af70: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
af80: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
af90: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
afa0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
afb0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
afc0: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
afd0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
afe0: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
aff0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
b000: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
b010: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
b020: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
b030: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
b040: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
b050: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
b060: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
b070: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
b080: 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53  ame;..  sqlite3S
b090: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
b0a0: 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31  , pBegin, pName1
b0b0: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
b0c0: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
b0d0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
b0e0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
b0f0: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
b100: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b110: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b120: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b130: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
b140: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
b150: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
b160: 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
b170: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
b180: 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c   pParse, p->iDb,
b190: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
b1a0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
b1b0: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
b1c0: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
b1d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b1e0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b1f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
b200: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
b210: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
b220: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
b230: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
b240: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
b250: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
b260: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
b270: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
b280: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
b290: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
b2a0: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
b2b0: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
b2c0: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
b2d0: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
b2e0: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
b2f0: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
b300: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
b310: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
b320: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
b330: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65  te3SelectDup(pSe
b340: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
b350: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b360: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50  lect);.  if( !pP
b370: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
b380: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
b390: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
b3a0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
b3b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
b3c0: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
b3d0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
b3e0: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
b3f0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
b400: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
b410: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
b420: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
b430: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
b440: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
b450: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
b460: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
b470: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
b480: 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20  = ((int)sEnd.z) 
b490: 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a  - (int)pBegin->z
b4a0: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
b4b0: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
b4c0: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
b4d0: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
b4e0: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
b4f0: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
b500: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
b510: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
b520: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
b530: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
b540: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
b550: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
b560: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
b570: 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20  se, &sEnd, 0);. 
b580: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
b590: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
b5a0: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
b5b0: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
b5c0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
b5d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
b5e0: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
b5f0: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
b600: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
b610: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
b620: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
b630: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
b640: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
b650: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
b660: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
b670: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
b680: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
b690: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
b6a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72  *pTable){.  Expr
b6b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
b6c0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
b6d0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
b6e0: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
b6f0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
b700: 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73  e );..  /* A pos
b710: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
b720: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
b730: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
b740: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
b750: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
b760: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
b770: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
b780: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
b790: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
b7a0: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
b7b0: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
b7c0: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
b7d0: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
b7e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
b7f0: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
b800: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
b810: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
b820: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
b830: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
b840: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
b850: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
b860: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
b870: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
b880: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
b890: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
b8a0: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
b8b0: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
b8c0: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
b8d0: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
b8e0: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
b8f0: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
b900: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
b910: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
b920: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
b930: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
b940: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
b950: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
b960: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
b970: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b980: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
b990: 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
b9a0: 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
b9b0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
b9c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
b9d0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
b9e0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
b9f0: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
ba00: 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
ba10: 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  mes..  */.  asse
ba20: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
ba30: 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f  ect ); /* If nCo
ba40: 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c  l==0, then pTabl
ba50: 65 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57  e must be a VIEW
ba60: 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61   */.  pSel = pTa
ba70: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  ble->pSelect;.. 
ba80: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   /* Note that th
ba90: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
baa0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
bab0: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
bac0: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
bad0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c  ements in this l
bae0: 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ist.  But we wil
baf0: 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72  l need to restor
bb00: 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20  e the list.  ** 
bb10: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
bb20: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
bb30: 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73  on afterwards, s
bb40: 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79  o we save a copy
bb50: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69   of.  ** the ori
bb60: 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e  ginal in pEList.
bb70: 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  .  */.  pEList =
bb80: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSel->pEList;. 
bb90: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
bba0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bbb0: 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66  up(pEList);.  if
bbc0: 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d  ( pSel->pEList==
bbd0: 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  0 ){.    pSel->p
bbe0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
bbf0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
bc00: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
bc10: 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  */.  }.  pTable-
bc20: 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53  >nCol = -1;.  pS
bc30: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
bc40: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
bc50: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
bc60: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  );.  if( pSelTab
bc70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bc80: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
bc90: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
bca0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
bcb0: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
bcc0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
bcd0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
bce0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
bcf0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
bd00: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
bd10: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
bd20: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53  SelTab);.    DbS
bd30: 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73  etProperty(pPars
bd40: 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69  e->db, pTable->i
bd50: 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  Db, DB_UnresetVi
bd60: 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ews);.  }else{. 
bd70: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
bd80: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
bd90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
bda0: 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29  lectUnbind(pSel)
bdb0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
bdc0: 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  istDelete(pSel->
bdd0: 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d  pEList);.  pSel-
bde0: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
bdf0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  ;.  return nErr;
be00: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61    .}../*.** Clea
be10: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
be20: 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57  es from the VIEW
be30: 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   pTable..**.** T
be40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
be50: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
be60: 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f  ny other table o
be70: 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69  r view is modifi
be80: 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20  ed..** The view 
be90: 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
bea0: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
beb0: 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f  epend directly o
bec0: 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20  r indirectly.** 
bed0: 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20  on the modified 
bee0: 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  or deleted table
bef0: 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63   so we need to c
bf00: 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c  lear the old col
bf10: 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20  umn.** names so 
bf20: 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
bf30: 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f  e recomputed..*/
bf40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
bf50: 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75  iteViewResetColu
bf60: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
bf70: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
bf80: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
bf90: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
bfa0: 65 21 3d 30 20 26 26 20 70 54 61 62 6c 65 2d 3e  e!=0 && pTable->
bfb0: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
bfc0: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
bfd0: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  able->aCol; i<pT
bfe0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
bff0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71   pCol++){.    sq
c000: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
c010: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
c020: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c  eFree(pCol->zDfl
c030: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  t);.    sqliteFr
c040: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
c050: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
c060: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
c070: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
c080: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
c090: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
c0a0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
c0b0: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
c0c0: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
c0d0: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
c0e0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
c0f0: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
c100: 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  te *db, int idx)
c110: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
c120: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
c130: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
c140: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
c150: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
c160: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
c170: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
c180: 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  tblHash); i; i=s
c190: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
c1a0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
c1b0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
c1c0: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
c1d0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
c1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65  .      sqliteVie
c1f0: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
c200: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
c210: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
c220: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
c230: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
c240: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
c250: 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20   token, look up 
c260: 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61  a table with tha
c270: 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20  t name.  If not 
c280: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20  found, leave.** 
c290: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65  an error for the
c2a0: 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20   parser to find 
c2b0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
c2c0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
c2d0: 65 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  e3TableFromToken
c2e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c2f0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20  Token *pTok){.  
c300: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54  char *zName;.  T
c310: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e  able *pTab;.  zN
c320: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
c330: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29  eFromToken(pTok)
c340: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
c350: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c360: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
c370: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
c380: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b, zName, 0);.  
c390: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
c3a0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
c3b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c3c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
c3d0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
c3e0: 25 54 22 2c 20 70 54 6f 6b 29 3b 0a 20 20 20 20  %T", pTok);.    
c3f0: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
c400: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
c410: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
c420: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c430: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
c440: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
c450: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
c460: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
c470: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c480: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
c490: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
c4a0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
c4b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
c4c0: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
c4d0: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
c4e0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
c4f0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
c500: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
c510: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
c520: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
c530: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
c540: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
c550: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
c560: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61  _drop_table;.  a
c570: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
c580: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
c590: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
c5a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
c5b0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
c5c0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
c5d0: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
c5e0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
c5f0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
c600: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
c610: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
c620: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
c630: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
c640: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
c650: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
c660: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
c670: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
c680: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
c690: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  b->iDb);.    con
c6a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
c6b0: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
c6c0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
c6d0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
c6e0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
c6f0: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
c700: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
c710: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c720: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
c730: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
c740: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
c750: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
c760: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
c770: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
c780: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
c790: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
c7a0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
c7b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
c7c0: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
c7d0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
c7e0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
c7f0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
c800: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
c810: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
c820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c830: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
c840: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
c850: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
c860: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
c870: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
c880: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
c890: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c8a0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c8b0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
c8c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
c8d0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
c8e0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c8f0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
c900: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
c910: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
c920: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c930: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
c940: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
c950: 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
c960: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
c970: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
c980: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c990: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ble;.  }.  if( i
c9a0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
c9b0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
c9c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c9d0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
c9e0: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
c9f0: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
ca00: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
ca10: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
ca20: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
ca30: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
ca40: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
ca50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ca60: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
ca70: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
ca80: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
ca90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
caa0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
cab0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
cac0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
cad0: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
cae0: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
caf0: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
cb00: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
cb10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cb20: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
cb30: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
cb40: 4f 70 4c 69 73 74 20 64 72 6f 70 54 61 62 6c 65  OpList dropTable
cb50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
cb60: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
cb70: 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20   ADDR(13), 0},. 
cb80: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
cb90: 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  8,    0, 0,     
cba0: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
cbb0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
cbc0: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
cbd0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
cbe0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
cbf0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
cc00: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
cc10: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
cc20: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   2,        0}, /
cc30: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  * sqlite_master.
cc40: 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  tbl_name */.    
cc50: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
cc60: 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20     0, ADDR(12), 
cc70: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
cc80: 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c  tring8,    0, 0,
cc90: 20 20 20 20 20 20 20 20 22 74 72 69 67 67 65 72          "trigger
cca0: 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
ccb0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c  olumn,     0, 2,
ccc0: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 73          0}, /* s
ccd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 74 79 70  qlite_master.typ
cce0: 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e */.      { OP_
ccf0: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
cd00: 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20  DDR(12), 0},.   
cd10: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
cd20: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
cd30: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cd40: 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
cd50: 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20 20 20  DDR(13), 0},.   
cd60: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
cd70: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
cd80: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cd90: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
cda0: 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20  DDR(3),  0}, /* 
cdb0: 31 32 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  12 */.    };.   
cdc0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
cdd0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
cde0: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
cdf0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
ce00: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
ce10: 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20  Tab->iDb);..    
ce20: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
ce30: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
ce40: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
ce50: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
ce60: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
ce70: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
ce80: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
ce90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
cea0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
ceb0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
cec0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
ced0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
cee0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
cef0: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
cf00: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
cf10: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
cf20: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 7c 7c  Db==pTab->iDb ||
cf30: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
cf40: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
cf50: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
cf60: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
cf70: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 1);.      if(
cf80: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
cf90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
cfa0: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
cfb0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
cfc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72  lse{.        pTr
cfd0: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
cfe0: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a  rigger;.      }.
cff0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
d000: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
d010: 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
d020: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
d030: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
d040: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
d050: 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
d060: 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
d070: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
d080: 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
d090: 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
d0a0: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
d0b0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
d0c0: 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
d0d0: 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
d0e0: 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
d0f0: 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
d100: 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
d110: 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
d120: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
d130: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
d140: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
d150: 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
d160: 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
d170: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
d180: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
d190: 61 62 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69 44  able(v, pTab->iD
d1a0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
d1b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
d1c0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
d1d0: 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f  (dropTable), dro
d1e0: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  pTable);.    sql
d1f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
d200: 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62  (v, base+1, pTab
d210: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
d220: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
d230: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 54 61 62  okie(db, v, pTab
d240: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
d250: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d260: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
d270: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
d280: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d290: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d2a0: 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 2d 3e  _Destroy, pTab->
d2b0: 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29  tnum, pTab->iDb)
d2c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ;.      for(pIdx
d2d0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
d2e0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
d2f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
d300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d310: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
d320: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78  pIdx->tnum, pIdx
d330: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ->iDb);.      }.
d340: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d350: 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
d360: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
d370: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
d380: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72   in-memory descr
d390: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
d3a0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ble..  **.  ** E
d3b0: 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65  xception: if the
d3c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
d3d0: 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45 58  egan with the EX
d3e0: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20  PLAIN keyword,. 
d3f0: 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e   ** then no chan
d400: 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  ges should be ma
d410: 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  de..  */.  if( !
d420: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
d430: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  ){.    sqliteUnl
d440: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
d450: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
d460: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
d470: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
d480: 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  es;.  }.  sqlite
d490: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
d4a0: 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f   iDb);..exit_dro
d4b0: 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
d4c0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
d4d0: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
d4e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d4f0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
d500: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
d510: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
d520: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
d530: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
d540: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
d550: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
d560: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
d570: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
d580: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
d590: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
d5a0: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
d5b0: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
d5c0: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
d5d0: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
d5e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
d5f0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
d600: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
d610: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
d620: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
d630: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
d640: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
d650: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
d660: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
d670: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
d680: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
d690: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
d6a0: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
d6b0: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
d6c0: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
d6d0: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
d6e0: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
d6f0: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
d700: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
d710: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
d720: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
d730: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
d740: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
d750: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
d760: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
d770: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
d780: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
d790: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
d7a0: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
d7b0: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
d7c0: 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  l sqlite3EndTabl
d7d0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
d7e0: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
d7f0: 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
d800: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
d810: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
d820: 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
d830: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
d840: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
d850: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
d860: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
d870: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
d880: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d890: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d8a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d8b0: 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
d8c0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
d8d0: 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
d8e0: 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
d8f0: 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
d900: 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
d910: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
d920: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
d930: 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
d940: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
d950: 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
d960: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
d970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d980: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
d990: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
d9a0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  /.){.  Table *p 
d9b0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d9c0: 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
d9d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
d9e0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
d9f0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  ;.  FKey *pFKey 
da00: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
da10: 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
da20: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
da30: 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65  nErr ) goto fk_e
da40: 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
da50: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
da60: 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
da70: 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  1;.    if( iCol<
da80: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
da90: 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
daa0: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
dab0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
dac0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
dad0: 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
dae0: 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
daf0: 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
db00: 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
db10: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
db20: 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
db30: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
db40: 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
db50: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
db60: 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
db70: 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
db80: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
db90: 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
dba0: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
dbb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
dbc0: 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
dbd0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
dbe0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
dbf0: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
dc00: 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
dc10: 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
dc20: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
dc30: 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
dc40: 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
dc50: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
dc60: 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
dc70: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
dc80: 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c  f(*pFKey) + nCol
dc90: 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
dca0: 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
dcb0: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
dcc0: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
dcd0: 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
dce0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
dcf0: 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28  nByte += strlen(
dd00: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
dd10: 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
dd20: 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
dd30: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  iteMalloc( nByte
dd40: 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
dd50: 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  =0 ) goto fk_end
dd60: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  ;.  pFKey->pFrom
dd70: 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
dd80: 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
dd90: 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
dda0: 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70  *)&pFKey[1];.  p
ddb0: 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74  FKey->aCol = (st
ddc0: 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b  ruct sColMap*)z;
ddd0: 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73  .  z += sizeof(s
dde0: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e  truct sColMap)*n
ddf0: 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  Col;.  pFKey->zT
de00: 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
de10: 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
de20: 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
de30: 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  = 0;.  z += pTo-
de40: 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  >n+1;.  pFKey->p
de50: 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46  NextTo = 0;.  pF
de60: 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
de70: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
de80: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
de90: 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
dea0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
deb0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
dec0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ded0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
dee0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
def0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
df00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
df10: 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
df20: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
df30: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
df40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
df50: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
df60: 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
df70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
df80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
df90: 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
dfa0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
dfb0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
dfc0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
dfd0: 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
dfe0: 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
dff0: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
e000: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
e010: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
e020: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
e030: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
e040: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
e050: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
e060: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
e070: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
e080: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f  t n = strlen(pTo
e090: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
e0a0: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
e0b0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
e0c0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
e0d0: 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
e0e0: 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
e0f0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
e100: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
e110: 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
e120: 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
e130: 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20  Key->deleteConf 
e140: 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a  = flags & 0xff;.
e150: 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43    pFKey->updateC
e160: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
e170: 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46  8 ) & 0xff;.  pF
e180: 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20  Key->insertConf 
e190: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29  = (flags >> 16 )
e1a0: 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c   & 0xff;..  /* L
e1b0: 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
e1c0: 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
e1d0: 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
e1e0: 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
e1f0: 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
e200: 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
e210: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
e220: 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  FKey);.  sqlite3
e230: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
e240: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
e250: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e260: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
e270: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e280: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
e290: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
e2a0: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
e2b0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
e2c0: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
e2d0: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
e2e0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
e2f0: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
e300: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
e310: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
e320: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
e330: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
e340: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
e350: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
e360: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
e370: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
e380: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
e390: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
e3a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e3b0: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
e3c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
e3d0: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
e3e0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
e3f0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
e400: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
e410: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
e420: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
e430: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
e440: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
e450: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
e460: 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a  Deferred;.}../*.
e470: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
e480: 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
e490: 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20   table.  pIndex 
e4a0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
e4b0: 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
e4c0: 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e   pTable is the n
e4d0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
e4e0: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
e4f0: 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
e500: 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
e510: 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
e520: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
e530: 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
e540: 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
e550: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
e560: 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
e570: 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
e580: 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
e590: 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
e5a0: 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
e5b0: 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
e5c0: 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
e5d0: 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
e5e0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
e5f0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
e600: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e610: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
e620: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
e630: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
e640: 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
e650: 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
e660: 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
e670: 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
e680: 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
e690: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
e6a0: 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
e6b0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
e6c0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
e6d0: 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
e6e0: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
e6f0: 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
e700: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c  *pParse,   /* Al
e710: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
e720: 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
e730: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
e740: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
e750: 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
e760: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
e770: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
e780: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
e790: 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
e7a0: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
e7b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
e7c0: 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62 6c 65 20  Name,  /* Table 
e7d0: 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
e7e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
e7f0: 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
e800: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
e810: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
e820: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
e830: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
e840: 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72  ,     /* OE_Abor
e850: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
e860: 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
e870: 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
e880: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
e890: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
e8a0: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
e8b0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e8c0: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
e8d0: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
e8e0: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
e8f0: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
e900: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
e910: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
e920: 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65 20 74 6f  = 0; /* Table to
e930: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
e940: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
e950: 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65 78   0; /* The index
e960: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
e970: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
e980: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
e990: 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
e9a0: 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
e9b0: 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
e9c0: 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69  D list */.  DbFi
e9d0: 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20  xer sFix;    /* 
e9e0: 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
e9f0: 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
ea00: 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
ea10: 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20  isTemp;      /* 
ea20: 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f  True for a tempo
ea30: 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20  rary index */.  
ea40: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
ea50: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20  rse->db;..  int 
ea60: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  iDb;          /*
ea70: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
ea80: 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
ea90: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
eaa0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
eab0: 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69   0; /* Unqualifi
eac0: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
ead0: 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
eae0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
eaf0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
eb00: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
eb10: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
eb20: 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
eb30: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
eb40: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
eb50: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
eb60: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
eb70: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
eb80: 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
eb90: 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
eba0: 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
ebb0: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
ebc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
ebd0: 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
ebe0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
ebf0: 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
ec00: 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
ec10: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
ec20: 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
ec30: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
ec40: 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
ec50: 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
ec60: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
ec70: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
ec80: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
ec90: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
eca0: 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
ecb0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ecc0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
ecd0: 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
ece0: 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
ecf0: 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c   if the the tabl
ed00: 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
ed10: 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
ed20: 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
ed30: 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  e to 1..    */. 
ed40: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
ed50: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
ed60: 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
ed70: 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32  ;.    if( pName2
ed80: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30   && pName2->n==0
ed90: 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
eda0: 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ->iDb==1 ){.    
edb0: 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d    iDb = 1;.    }
edc0: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
edd0: 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
ede0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
edf0: 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
ee00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
ee10: 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
ee20: 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
ee30: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
ee40: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ee50: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
ee60: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
ee70: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c  ble(pParse, pTbl
ee80: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
ee90: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
eea0: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
eeb0: 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
eec0: 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
eed0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
eee0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70    assert( iDb==p
eef0: 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65  Tab->iDb );.  }e
ef00: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
ef10: 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
ef20: 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
ef30: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
ef40: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
ef50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
ef60: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
ef70: 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
ef80: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
ef90: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
efa0: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
efb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
efc0: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
efd0: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
efe0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
eff0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
f000: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
f010: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
f020: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
f030: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f040: 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
f050: 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
f060: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
f070: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
f080: 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e   isTemp = pTab->
f090: 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20  iDb==1;..  /*.  
f0a0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
f0b0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
f0c0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
f0d0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
f0e0: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
f0f0: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
f100: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
f110: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
f120: 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
f130: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
f140: 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
f150: 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
f160: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
f170: 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
f180: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
f190: 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
f1a0: 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
f1b0: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
f1c0: 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
f1d0: 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
f1e0: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
f1f0: 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
f200: 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
f210: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
f220: 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
f230: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
f240: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
f250: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
f260: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
f270: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
f280: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
f290: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
f2a0: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
f2b0: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
f2c0: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
f2d0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f2e0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
f2f0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ame);.    if( zN
f300: 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
f310: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f320: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
f330: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
f340: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
f350: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
f360: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
f370: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
f380: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
f390: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
f3a0: 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
f3b0: 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
f3c0: 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
f3d0: 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
f3e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
f3f0: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
f400: 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
f410: 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
f420: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
f430: 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  ISameName = sqli
f440: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
f450: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
f460: 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20  iDb].zName))!=0 
f470: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f480: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f490: 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
f4a0: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
f4b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
f4c0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
f4d0: 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
f4e0: 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e      if( (pTSameN
f4f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ame = sqlite3Fin
f500: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
f510: 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
f520: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f530: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
f540: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
f550: 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
f560: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
f570: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
f580: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
f590: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f5a0: 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( pName==0 ){. 
f5b0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
f5c0: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
f5d0: 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
f5e0: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
f5f0: 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
f600: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
f610: 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
f620: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
f630: 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20  uf,"_%d",n);.   
f640: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
f650: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
f660: 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  (&zName, "sqlite
f670: 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54  _autoindex_", pT
f680: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c  ab->zName, zBuf,
f690: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
f6a0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
f6b0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
f6c0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
f6d0: 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
f6e0: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
f6f0: 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
f700: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f710: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
f720: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
f730: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
f740: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
f750: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
f760: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f770: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
f780: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
f790: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
f7a0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f7b0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
f7c0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
f7d0: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
f7e0: 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
f7f0: 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20 53  ( isTemp ) i = S
f800: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
f810: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
f820: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
f830: 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
f840: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
f850: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f860: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
f870: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
f880: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
f890: 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
f8a0: 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
f8b0: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
f8c0: 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
f8d0: 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
f8e0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
f8f0: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
f900: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f910: 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
f920: 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
f930: 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
f940: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
f950: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c  st==0 ){.    nul
f960: 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43  lId.z = pTab->aC
f970: 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
f980: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c  .zName;.    null
f990: 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75  Id.n = strlen(nu
f9a0: 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69  llId.z);.    pLi
f9b0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
f9c0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c  ListAppend(0, 0,
f9d0: 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
f9e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
f9f0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
fa00: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
fa10: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
fa20: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
fa30: 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64  re. .  */.  pInd
fa40: 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
fa50: 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  c( sizeof(Index)
fa60: 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   + strlen(zName)
fa70: 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20   + 1 +.         
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
fa90: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69  sizeof(int) + si
faa0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a  zeof(CollSeq*))*
fab0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  pList->nExpr );.
fac0: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
fad0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
fae0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
faf0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
fb00: 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  int*)&pIndex->ke
fb10: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73  yInfo.aColl[pLis
fb20: 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e  t->nExpr];.  pIn
fb30: 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
fb40: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ar*)&pIndex->aiC
fb50: 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78  olumn[pList->nEx
fb60: 70 72 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49  pr];.  strcpy(pI
fb70: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
fb80: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  me);.  pIndex->p
fb90: 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
fba0: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
fbb0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
fbc0: 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
fbd0: 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  r = onError;.  p
fbe0: 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
fbf0: 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70   = pName==0;.  p
fc00: 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62  Index->iDb = iDb
fc10: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
fc20: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
fc30: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
fc40: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
fc50: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
fc60: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
fc70: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
fc80: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
fc90: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
fca0: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
fcb0: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
fcc0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
fcd0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
fce0: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  +){.    for(j=0;
fcf0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
fd00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
fd10: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
fd20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
fd30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
fd40: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
fd50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fd60: 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
fd70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
fd80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
fd90: 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20  table %s has no 
fda0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22  column named %s"
fdb0: 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
fdc0: 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  zName, pList->a[
fdd0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
fde0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
fdf0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
fe00: 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
fe10: 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  umn[i] = j;.    
fe20: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
fe30: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
fe40: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b  ssert( pList->a[
fe50: 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  i].pExpr->pColl 
fe60: 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  );.      pIndex-
fe70: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
fe80: 5d 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ] = pList->a[i].
fe90: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pExpr->pColl;.  
fea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
feb0: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
fec0: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e  Coll[i] = pTab->
fed0: 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
fee0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
fef0: 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
ff00: 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20  .aColl[i] );.   
ff10: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
ff20: 75 73 79 20 26 26 20 0a 20 20 20 20 20 20 20 20  usy && .        
ff30: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
ff40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64  Seq(pParse, pInd
ff50: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
ff60: 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20  l[i]) .    ){.  
ff70: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
ff80: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
ff90: 7d 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e  }.  }.  pIndex->
ffa0: 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d  keyInfo.nField =
ffb0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a   pList->nExpr;..
ffc0: 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
ffd0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
ffe0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
fff0: 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
10000 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
10010 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
10020 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
10030 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
10040 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
10050 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
10060 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
10070 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
10080 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
10090 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
100a0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
100b0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
100c0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
100d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
100e0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
100f0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
10100 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
10110 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
10120 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
10130 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
10140 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
10150 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
10160 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
10170 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
10180 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
10190 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
101a0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
101b0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
101c0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
101d0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
101e0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
101f0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
10200 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
10210 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
10220 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
10230 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
10240 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
10250 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
10260 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
10270 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10280 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
10290 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
102a0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75  assert( pIdx->au
102b0 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20  toIndex );.     
102c0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
102d0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
102e0 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
102f0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70  pIdx->nColumn!=p
10300 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
10310 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
10320 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
10330 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b  ->nColumn; k++){
10340 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
10350 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
10360 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
10370 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
10380 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6b       if( pIdx->k
10390 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21  eyInfo.aColl[k]!
103a0 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  =pIndex->keyInfo
103b0 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65 61  .aColl[k] ) brea
103c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
103d0 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43   if( k==pIdx->nC
103e0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
103f0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
10400 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
10410 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
10420 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
10430 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
10440 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
10450 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
10460 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
10470 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
10480 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
10490 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
104a0 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
104b0 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
104c0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
104d0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
104e0 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
104f0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
10500 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
10510 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
10520 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
10530 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
10540 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
10550 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
10560 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
10570 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
10580 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
10590 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
105a0 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72  ed behaviour for
105b0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
105c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
105d0 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
105e0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
105f0 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
10600 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
10610 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
10620 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10630 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
10640 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
10650 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
10660 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
10670 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
10680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10690 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
106a0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
106b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
106c0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
106d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
106e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
106f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
10700 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10710 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
10720 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
10730 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
10740 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
10750 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
10760 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
10770 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10780 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
10790 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
107a0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
107b0 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
107c0 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
107d0 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49  sert(&db->aDb[pI
107e0 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61  ndex->iDb].idxHa
107f0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
10810 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
10820 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
10830 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e)+1, pIndex);. 
10840 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
10850 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
10860 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
10870 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
10880 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f  ed */.      goto
10890 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
108a0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
108b0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
108c0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
108d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
108e0 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
108f0 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
10900 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
10910 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
10920 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
10930 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
10940 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  isk.  So do not 
10950 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
10960 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45  k.  ** again.  E
10970 78 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65  xtract the table
10980 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65   number from the
10990 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
109a0 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  m field..  */.  
109b0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
109c0 79 20 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30  y && pTblName!=0
109d0 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
109e0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
109f0 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
10a00 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
10a10 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
10a20 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
10a30 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
10a40 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
10a50 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
10a60 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
10a70 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
10a80 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
10a90 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
10aa0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
10ab0 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
10ac0 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
10ad0 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
10ae0 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
10af0 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
10b00 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
10b10 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
10b20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
10b30 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
10b40 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
10b50 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
10b60 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
10b70 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
10b80 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
10b90 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
10ba0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
10bb0 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
10bc0 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
10bd0 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
10be0 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
10bf0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
10c00 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
10c10 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
10c20 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
10c30 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
10c40 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
10c50 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
10c60 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
10c70 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
10c80 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
10c90 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
10ca0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
10cb0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
10cc0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
10cd0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
10ce0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
10cf0 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
10d00 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
10d10 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
10d20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  *v;.    int lbl1
10d30 2c 20 6c 62 6c 32 3b 0a 0a 20 20 20 20 76 20 3d  , lbl2;..    v =
10d40 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10d50 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
10d60 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
10d70 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10d80 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
10d90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
10da0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
10db0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
10dc0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
10dd0 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
10de0 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20  Table(v, iDb);. 
10df0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10e00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10e10 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
10e20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10e30 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
10e40 38 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78 22  8, 0, 0, "index"
10e50 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
10e70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
10e80 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
10e90 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
10ea0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10eb0 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
10ec0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10ee0 65 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  eOp3(v, OP_Creat
10ef0 65 49 6e 64 65 78 2c 20 30 2c 20 69 44 62 2c 28  eIndex, 0, iDb,(
10f00 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74  char*)&pIndex->t
10f10 6e 75 6d 2c 50 33 5f 50 4f 49 4e 54 45 52 29 3b  num,P3_POINTER);
10f20 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
10f30 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  m = 0;.    if( p
10f40 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
10f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10f60 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
10f70 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10f80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10f90 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
10fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10fb0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
10fc0 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20  enWrite, 1, 0,. 
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64      (char*)&pInd
10ff0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  ex->keyInfo, P3_
11000 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a  KEYINFO);.    }.
11010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11020 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
11030 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  g8, 0, 0);.    i
11040 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
11050 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  d ){.      if( o
11060 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
11070 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11080 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
11090 2c 20 2d 31 2c 20 22 43 52 45 41 54 45 20 49 4e  , -1, "CREATE IN
110a0 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43  DEX ", P3_STATIC
110b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
110c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
110d0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
110e0 31 2c 20 22 43 52 45 41 54 45 20 55 4e 49 51 55  1, "CREATE UNIQU
110f0 45 20 49 4e 44 45 58 20 22 2c 20 50 33 5f 53 54  E INDEX ", P3_ST
11100 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
11110 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11120 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
11130 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
11140 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
11150 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61 6d 65  >z) - Addr(pName
11160 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  ->z) + 1;.      
11170 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11180 65 50 33 28 76 2c 20 2d 31 2c 20 70 4e 61 6d 65  eP3(v, -1, pName
11190 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  ->z, n);.      s
111a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
111b0 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 38 2c 20 32  v, OP_Concat8, 2
111c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
111d0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
111e0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
111f0 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20   5, 0, "tttit", 
11200 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
11210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11220 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
11230 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
11240 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
11250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11260 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
11270 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
11280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11290 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
112a0 70 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62  penRead, 2, pTab
112b0 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 2f  ->tnum);.      /
112c0 2a 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76  * VdbeComment((v
112d0 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  , "%s", pTab->zN
112e0 61 6d 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ame)); */.      
112f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11300 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
11310 75 6d 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e 6e  umns, 2, pTab->n
11320 43 6f 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  Col);.      lbl2
11330 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11340 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
11350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11360 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
11370 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20   2, lbl2);.     
11380 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56   lbl1 = sqlite3V
11390 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
113a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
113b0 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
113c0 28 76 2c 20 70 49 6e 64 65 78 2c 20 32 29 3b 0a  (v, pIndex, 2);.
113d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
113e0 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 50 75  eOp3(v, OP_IdxPu
113f0 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e  t, 1, pIndex->on
11400 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a  Error!=OE_None,.
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63        "indexed c
11430 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75  olumns are not u
11440 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49  nique", P3_STATI
11450 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
11460 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11470 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b  _Next, 2, lbl1);
11480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11490 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
114a0 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73  , lbl2);.      s
114b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
114c0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20  v, OP_Close, 2, 
114d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
114e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
114f0 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
11500 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 62     }.    if( pTb
11510 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
11520 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
11530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11540 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
11550 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   v, iDb);.      
11560 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
11570 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
11580 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
11590 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69     sqlite3EndWri
115a0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
115b0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
115c0 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
115d0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
115e0 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
115f0 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
11600 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
11610 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
11620 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
11630 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
11640 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
11650 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
11660 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
11670 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
11680 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
11690 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
116a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72  .  */.  if( onEr
116b0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
116c0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
116d0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 54 61  =0.       || pTa
116e0 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
116f0 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
11700 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
11710 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
11720 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  x;.    pTab->pIn
11730 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
11740 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
11750 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
11760 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 68 69  >pIndex;.    whi
11770 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
11780 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
11790 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
117a0 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
117b0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
117c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
117d0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
117e0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
117f0 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e  ;.    pOther->pN
11800 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
11810 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a  }.  pIndex = 0;.
11820 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
11830 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
11840 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
11850 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
11860 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 70 49   ) sqliteFree(pI
11870 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
11880 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
11890 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
118a0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
118b0 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
118c0 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
118d0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
118e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
118f0 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
11900 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
11910 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
11920 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
11930 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
11940 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
11950 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
11960 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
11970 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a  rcList *pName){.
11980 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
11990 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
119a0 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
119b0 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
119c0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
119d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
119e0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
119f0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
11a00 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64  Src==1 );.  pInd
11a10 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
11a20 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
11a30 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
11a40 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
11a50 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
11a60 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
11a70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11a80 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
11a90 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
11aa0 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
11ab0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
11ac0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
11ad0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
11ae0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
11af0 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
11b00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11b10 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
11b20 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
11b30 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
11b40 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
11b50 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
11b60 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
11b70 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
11b80 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2f 2a 0a  p_index;.  }./*.
11b90 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
11ba0 62 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  b>1 ){.    sqlit
11bb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11bc0 65 2c 20 22 63 61 6e 6e 6f 74 20 61 6c 74 65 72  e, "cannot alter
11bd0 20 73 63 68 65 6d 61 20 6f 66 20 61 74 74 61 63   schema of attac
11be0 68 65 64 20 22 0a 20 20 20 20 20 20 20 22 64 61  hed ".       "da
11bf0 74 61 62 61 73 65 73 22 2c 20 30 29 3b 0a 20 20  tabases", 0);.  
11c00 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
11c10 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2a 2f 0a 23  _index;.  }.*/.#
11c20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11c30 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11c40 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
11c50 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
11c60 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
11c70 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
11c80 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
11c90 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
11ca0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
11cb0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
11cc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
11cd0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
11ce0 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
11cf0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11d00 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11d10 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
11d20 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
11d30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
11d40 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
11d50 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
11d60 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
11d70 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
11d80 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
11d90 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
11da0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
11db0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
11dc0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
11dd0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11de0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
11df0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
11e00 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11e10 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
11e20 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
11e30 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
11e40 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
11e50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
11e60 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
11e70 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74  tatic VdbeOpList
11e80 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
11e90 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
11ea0 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
11eb0 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
11ec0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
11ed0 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
11ee0 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 1 */.      {
11ef0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
11f00 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  1, 1,       0},.
11f10 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f        { OP_MemLo
11f20 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ad,    1, 0,    
11f30 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
11f40 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
11f50 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
11f60 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
11f70 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Eq,         0, 
11f80 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(8), 0},.   
11f90 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
11fa0 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
11fb0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
11fc0 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
11fd0 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20  DR(9), 0},.     
11fe0 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
11ff0 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
12000 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 8 */.    };
12010 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a  .    int base;..
12020 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12030 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
12040 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78  Parse, 0, pIndex
12050 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
12060 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
12070 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44  le(v, pIndex->iD
12080 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
12090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
120a0 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
120b0 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f  (dropIndex), dro
120c0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
120d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
120e0 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64  (v, base+1, pInd
120f0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
12100 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69     if( pIndex->i
12110 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db!=1 ){.      s
12120 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
12130 69 65 28 64 62 2c 20 76 2c 20 70 49 6e 64 65 78  ie(db, v, pIndex
12140 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ->iDb);.    }.  
12150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12160 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
12170 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12180 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12190 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65  P_Destroy, pInde
121a0 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d  x->tnum, pIndex-
121b0 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
121c0 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
121d0 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
121e0 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
121f0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
12200 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ription of this 
12210 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
12220 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
12230 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
12240 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
12250 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
12260 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
12270 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
12280 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65  nChanges;.  }..e
12290 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
122a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
122b0 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d  Delete(pName);.}
122c0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
122d0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
122e0 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
122f0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
12300 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
12310 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
12320 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
12330 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
12340 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
12350 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
12360 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
12370 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
12380 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
12390 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
123a0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
123b0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
123c0 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
123d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
123e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
123f0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b  ist->nAlloc = 0;
12400 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
12410 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41  ->nId>=pList->nA
12420 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72 75  lloc ){.    stru
12430 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
12440 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  a;.    pList->nA
12450 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41  lloc = pList->nA
12460 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20  lloc*2 + 5;.    
12470 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
12480 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73  c(pList->a, pLis
12490 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  t->nAlloc*sizeof
124a0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
124b0 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
124c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
124d0 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
124e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
124f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
12500 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
12510 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
12520 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30  a[pList->nId], 0
12530 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
12540 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69 73 74 2d  a[0]));.  pList-
12550 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a  >a[pList->nId].z
12560 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
12570 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
12580 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  en);.  pList->nI
12590 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
125a0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ist;.}../*.** Ap
125b0 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
125c0 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
125d0 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
125e0 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
125f0 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
12600 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
12610 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
12620 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
12630 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
12640 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
12650 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
12660 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
12670 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
12680 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
12690 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
126a0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
126b0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
126c0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
126d0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
126e0 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
126f0 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
12700 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
12710 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
12720 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
12730 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
12740 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
12750 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
12760 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
12770 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
12780 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
12790 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
127a0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
127b0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
127c0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
127d0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
127e0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
127f0 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
12800 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
12810 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
12820 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
12830 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
12840 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
12850 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
12860 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
12870 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
12880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
12890 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
128a0 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
128b0 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
128c0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
128d0 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
128e0 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
128f0 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
12900 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
12910 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
12920 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
12930 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
12940 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
12950 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
12960 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
12970 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
12980 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
12990 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
129a0 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
129b0 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75 63  tabase){.  struc
129c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
129d0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
129e0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
129f0 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
12a00 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  c( sizeof(SrcLis
12a10 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
12a20 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
12a30 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
12a40 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
12a50 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e  if( pList->nSrc>
12a60 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
12a70 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
12a80 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  New;.    pList->
12a90 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20  nAlloc *= 2;.   
12aa0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   pNew = sqliteRe
12ab0 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20  alloc(pList,.   
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
12ad0 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c  of(*pList) + (pL
12ae0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ist->nAlloc-1)*s
12af0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
12b00 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
12b10 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
12b20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
12b30 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
12b40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
12b50 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
12b60 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
12b70 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
12b80 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73  t->nSrc];.  mems
12b90 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
12ba0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
12bb0 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  );.  if( pDataba
12bc0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
12bd0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
12be0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
12bf0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
12c00 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  && pTable ){.   
12c10 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
12c20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
12c30 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
12c40 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
12c50 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
12c60 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
12c70 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
12c80 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65  (pTable);.  pIte
12c90 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
12ca0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
12cb0 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b 0a  ken(pDatabase);.
12cc0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
12cd0 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e   = -1;.  pList->
12ce0 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
12cf0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
12d00 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20   Assign cursors 
12d10 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
12d20 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
12d30 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
12d40 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
12d50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
12d60 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
12d70 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
12d80 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
12d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12da0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  pList->a[i].iCur
12db0 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  sor<0 ){.      p
12dc0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
12dd0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
12de0 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  b++;.    }.  }.}
12df0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
12e00 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
12e10 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
12e20 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
12e30 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
12e40 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
12e50 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74  AddAlias(SrcList
12e60 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
12e70 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
12e80 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e  List && pList->n
12e90 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69  Src>0 ){.    pLi
12ea0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
12eb0 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71  c-1].zAlias = sq
12ec0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
12ed0 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  en(pToken);.  }.
12ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
12ef0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
12f00 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
12f10 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
12f20 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
12f30 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
12f40 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
12f50 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
12f60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12f70 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
12f80 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
12f90 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
12fa0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
12fb0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
12fc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12fd0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
12fe0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
12ff0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
13000 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
13010 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
13020 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
13030 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
13040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13050 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
13060 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
13070 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
13080 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
13090 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
130a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
130b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
130c0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
130d0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
130e0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
130f0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
13100 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
13110 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
13120 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
13130 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
13140 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
13150 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
13160 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
13170 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
13180 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
13190 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
131a0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
131b0 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[i].zDatabase
131c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
131d0 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
131e0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
131f0 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
13200 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  .zAlias);.    if
13210 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  ( pList->a[i].pT
13220 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69  ab && pList->a[i
13230 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
13240 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
13250 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
13260 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  0, pList->a[i].p
13270 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
13280 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
13290 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
132a0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
132b0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
132c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29  pList->a[i].pOn)
132d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
132e0 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  istDelete(pList-
132f0 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  >a[i].pUsing);. 
13300 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
13310 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
13320 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
13330 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
13340 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
13350 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
13360 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
13370 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
13380 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
13390 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
133a0 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
133b0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
133c0 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
133d0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
133e0 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
133f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
13400 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
13410 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
13420 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
13430 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65  GIN", 0, 0) ) re
13440 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
13450 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13460 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
13470 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
13480 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13490 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
134a0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
134b0 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
134c0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
134d0 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
134e0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
134f0 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
13500 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
13510 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
13520 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
13530 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
13540 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
13550 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
13560 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
13570 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
13580 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
13590 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
135a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
135b0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
135c0 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
135d0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
135e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
135f0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
13600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13610 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
13620 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
13630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
13640 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
13650 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13660 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
13670 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
13680 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
13690 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
136a0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
136b0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
136c0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
136d0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
136e0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
136f0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
13700 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
13710 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
13720 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13730 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
13740 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
13750 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
13760 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
13770 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13780 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
13790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
137a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
137b0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
137c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
137d0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
137e0 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
137f0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
13800 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20  ie and start.** 
13810 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
13820 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64  on for all named
13830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
13840 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70  .**.** It is imp
13850 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
13860 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62  schema cookies b
13870 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61  e verified and a
13880 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73  ll.** read trans
13890 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74  actions be start
138a0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  ed before anythi
138b0 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20  ng else happens 
138c0 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70  in.** the VDBE p
138d0 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69  rogram.  But thi
138e0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
138f0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75   called after mu
13900 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65  ch other.** code
13910 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61   has been genera
13920 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73  ted.  So here is
13930 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a   what we do:.**.
13940 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
13950 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
13960 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64  s called, we cod
13970 65 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 68  e an OP_Gosub th
13980 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
13990 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
139a0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
139b0 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
139c0 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
139d0 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
139e0 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
139f0 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
13a00 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
13a10 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
13a20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
13a30 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
13a40 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
13a50 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
13a60 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
13a70 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
13a80 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
13a90 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
13aa0 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
13ab0 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
13ac0 73 75 62 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  sub P2 value.** 
13ad0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
13ae0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
13af0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
13b00 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
13b10 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
13b20 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
13b30 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
13b40 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
13b50 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69  Coding()..*/.voi
13b60 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
13b70 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
13b80 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
13b90 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
13ba0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
13bb0 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
13bc0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13bd0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
13be0 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
13bf0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
13c00 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
13c10 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
13c20 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
13c30 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  b;.  assert( iDb
13c40 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
13c50 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
13c60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
13c70 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
13c80 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33  .  assert( iDb<3
13c90 32 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  2 );.  if( pPars
13ca0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 3d 3d 30  e->cookieMask==0
13cb0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
13cc0 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
13cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13ce0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
13cf0 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 31 3c  .  }.  mask = 1<
13d00 3c 69 44 62 3b 0a 20 20 69 66 28 20 28 70 50 61  <iDb;.  if( (pPa
13d10 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
13d20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
13d30 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
13d40 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
13d50 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
13d60 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
13d70 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
13d80 5f 63 6f 6f 6b 69 65 3b 0a 20 20 7d 0a 7d 0a 0a  _cookie;.  }.}..
13d90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
13da0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
13db0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
13dc0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
13dd0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
13de0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
13df0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13e00 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
13e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
13e20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
13e30 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
13e40 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
13e50 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
13e60 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
13e70 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
13e80 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
13e90 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
13ea0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
13eb0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
13ec0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
13ed0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
13ee0 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
13ef0 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
13f00 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
13f10 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
13f20 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
13f30 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
13f40 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
13f50 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
13f60 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
13f70 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
13f80 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
13f90 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
13fa0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
13fb0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
13fc0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
13fd0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
13fe0 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
13ff0 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
14000 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
14010 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
14020 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
14030 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  be set..**.** On
14040 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20  ly database iDb 
14050 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
14060 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
14070 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20  ritable by this 
14080 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d  call..** If iDb=
14090 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  =0, then the mai
140a0 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62  n and temp datab
140b0 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72  ases are made wr
140c0 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20  itable.   If.** 
140d0 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79  iDb==1 then only
140e0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
140f0 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  se is made writa
14100 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74  ble.  If iDb>1 t
14110 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  hen the.** speci
14120 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64  fied auxiliary d
14130 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
14140 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
14150 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
14160 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14170 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
14180 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
14190 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
141a0 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
141b0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
141c0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
141d0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
141e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
141f0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
14200 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
14210 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d    pParse->writeM
14220 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20  ask |= 1<<iDb;. 
14230 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e   if( setStatemen
14240 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
14250 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14260 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20  Statement, iDb, 
14270 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  0);.  }.  if( iD
14280 62 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  b!=1 ){.    sqli
14290 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
142a0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73  ration(pParse, s
142b0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b  etStatement, 1);
142c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
142d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
142e0 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70   concludes an op
142f0 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79  eration that may
14300 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a   have changed.**
14310 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
14320 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  If a statement t
14330 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
14340 74 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d 69  tarted, then emi
14350 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69  t.** an OP_Commi
14360 74 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73  t that will caus
14370 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
14380 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f   be committed to
14390 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   disk..**.** Not
143a0 65 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e  e that checkpoin
143b0 74 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  ts are automatic
143c0 61 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 61  ally committed a
143d0 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  t the end of.** 
143e0 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f  a statement.  No
143f0 74 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68 65  te also that the
14400 72 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70  re can be multip
14410 6c 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  le calls to .** 
14420 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
14430 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74  eOperation() but
14440 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e   there should on
14450 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a  ly be a single.*
14460 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
14470 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
14480 6f 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e 63  on() at the conc
14490 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lusion of the st
144a0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
144b0 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65   sqlite3EndWrite
144c0 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
144d0 2a 70 50 61 72 73 65 29 7b 0a 20 20 2f 2a 20 44  *pParse){.  /* D
144e0 65 6c 65 74 65 20 6d 65 21 20 2a 2f 0a 20 20 72  elete me! */.  r
144f0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  eturn;.}../* .**
14500 20 52 65 74 75 72 6e 20 74 68 65 20 74 72 61 6e   Return the tran
14510 73 69 65 6e 74 20 73 71 6c 69 74 65 33 5f 76 61  sient sqlite3_va
14520 6c 75 65 20 6f 62 6a 65 63 74 20 75 73 65 64 20  lue object used 
14530 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 63 6f 6e  for encoding con
14540 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 64 75 72 69  versions.** duri
14550 6e 67 20 53 51 4c 20 63 6f 6d 70 69 6c 61 74 69  ng SQL compilati
14560 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  on..*/.sqlite3_v
14570 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 47 65 74  alue *sqlite3Get
14580 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 73  TransientValue(s
14590 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66  qlite *db){.  if
145a0 28 20 21 64 62 2d 3e 70 56 61 6c 75 65 20 29 7b  ( !db->pValue ){
145b0 0a 20 20 20 20 64 62 2d 3e 70 56 61 6c 75 65 20  .    db->pValue 
145c0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
145d0 77 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  w();.  }.  retur
145e0 6e 20 64 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a  n db->pValue;.}.