/ Hex Artifact Content
Login

Artifact ecc10d4e5232a49f55304dd9b90739f2771e34ef:


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 37 20 32 30 30 34 2f 30 36 2f 32 39 20 30  237 2004/06/29 0
0300: 38 3a 35 39 3a 33 35 20 64 61 6e 69 65 6c 6b 31  8:59:35 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 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
0cd0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
0ce0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
0cf0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
0d00: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
0d10: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
0d20: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
0d30: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
0d40: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
0d50: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
0d60: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
0d70: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
0d80: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
0d90: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
0da0: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
0db0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
0dc0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
0dd0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
0de0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
0df0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
0e00: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
0e10: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
0e20: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
0e30: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
0e40: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
0e50: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
0e60: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
0e70: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
0e80: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
0e90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
0ea0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
0eb0: 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  ite *db, const c
0ec0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
0ed0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
0ee0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
0ef0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
0f00: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
0f10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62  );.  assert( (db
0f20: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
0f30: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c  _Initialized) ||
0f40: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
0f50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
0f60: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
0f70: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
0f80: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
0f90: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
0fa0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
0fb0: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
0fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
0fd0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
0fe0: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
0ff0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1000: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1010: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74  nd(&db->aDb[j].t
1020: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  blHash, zName, s
1030: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
1040: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
1050: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
1060: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
1070: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1080: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1090: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
10a0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
10b0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
10c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
10d0: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
10e0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
10f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1100: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
1110: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1120: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1130: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
1140: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
1150: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
1160: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
1170: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1180: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
1190: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
11a0: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
11b0: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
11c0: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
11d0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
11e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
11f0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
1200: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
1210: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
1220: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
1230: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1250: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1260: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
1270: 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  p;..  /* Read th
1280: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1290: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
12a0: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
12b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
12c0: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
12d0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
12e0: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
12f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1300: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1310: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
1320: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  rn 0;.  }..  p =
1330: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1340: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
1350: 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20  ame, zDbase);.  
1360: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
1370: 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20  if( zDbase ){.  
1380: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1390: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
13a0: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25  such table: %s.%
13b0: 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  s", zDbase, zNam
13c0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
13d0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
13e0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
13f0: 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20  Name, 0)!=0 ){. 
1400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1410: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
1420: 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  ble \"%s\" is no
1430: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22  t in database \"
1440: 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
1450: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
1460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1470: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1480: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1490: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e  h table: %s", zN
14a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
14b0: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
14c0: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
14d0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
14e0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
14f0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1500: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1510: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
1520: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
1530: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
1540: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
1550: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1560: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
1570: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
1580: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1590: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
15a0: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
15b0: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
15c0: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
15d0: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61  r the.** table a
15e0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  nd the first mat
15f0: 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72  ching index is r
1600: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
1610: 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75  ecking.** for du
1620: 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61  plicate index na
1630: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
1640: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
1650: 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74  is.** TEMP first
1660: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
1670: 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  n any auxiliary 
1680: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a  databases added.
1690: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ** using the ATT
16a0: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ACH command..*/.
16b0: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69  Index *sqlite3Fi
16c0: 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  ndIndex(sqlite *
16d0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
16e0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
16f0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
1700: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1710: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ;.  assert( (db-
1720: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1730: 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20  Initialized) || 
1740: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
1750: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1760: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1770: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
1780: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
1790: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
17a0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
17b0: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
17c0: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
17d0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
17e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
17f0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1800: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64  d(&db->aDb[j].id
1810: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
1820: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1830: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1840: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1850: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  p;.}../*.** Remo
1860: 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  ve the given ind
1870: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
1880: 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e  x hash table, an
1890: 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65  d free.** its me
18a0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e  mory structures.
18b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
18c0: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
18d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
18e0: 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a  sh tables but.**
18f0: 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e   it is not unlin
1900: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ked from the Tab
1910: 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78  le that it index
1920: 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67  es..** Unlinking
1930: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
1940: 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20  must be done by 
1950: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1960: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1970: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
1980: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  eIndex(sqlite *d
1990: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  b, Index *p){.  
19a0: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20  Index *pOld;..  
19b0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26  assert( db!=0 &&
19c0: 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a   p->zName!=0 );.
19d0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
19e0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
19f0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48  aDb[p->iDb].idxH
1a00: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20  ash, p->zName,. 
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28           strlen(
1a30: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
1a40: 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26  .  if( pOld!=0 &
1a50: 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20  & pOld!=p ){.   
1a60: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
1a70: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
1a80: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c  Db].idxHash, pOl
1a90: 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  d->zName,.      
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ab0: 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d  trlen(pOld->zNam
1ac0: 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d  e)+1, pOld);.  }
1ad0: 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41 66  .  if( p->zColAf
1ae0: 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  f ){.    sqliteF
1af0: 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  ree(p->zColAff);
1b00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
1b10: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  e(p);.}../*.** U
1b20: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
1b30: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74  index from its t
1b40: 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76  able, then remov
1b50: 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66  e.** the index f
1b60: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
1b70: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
1b80: 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e its memory.** 
1b90: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
1ba0: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
1bb0: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
1bc0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1bd0: 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66  x *pIndex){.  if
1be0: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
1bf0: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
1c00: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
1c10: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
1c20: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
1c40: 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  ex *p;.    for(p
1c50: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
1c60: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
1c70: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
1c80: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
1c90: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e    if( p && p->pN
1ca0: 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ext==pIndex ){. 
1cb0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
1cc0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1cd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1ce0: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
1cf0: 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a   pIndex);.}../*.
1d00: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
1d10: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
1d20: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
1d30: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
1d40: 66 0a 2a 2a 20 61 20 73 69 67 6c 65 20 64 61 74  f.** a sigle dat
1d50: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
1d60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1d70: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
1d80: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 63  .** before the c
1d90: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
1da0: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
1db0: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
1dc0: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
1dd0: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
1de0: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
1df0: 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63  on or if a.** sc
1e00: 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d  hema-cookie mism
1e10: 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  atch occurs..**.
1e20: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
1e30: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
1e40: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
1e50: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
1e60: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
1e70: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
1e80: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
1e90: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
1ea0: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
1eb0: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
1ec0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
1ed0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
1ee0: 61 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e  a(sqlite *db, in
1ef0: 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c  t iDb){.  HashEl
1f00: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
1f10: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
1f20: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20  temp2;.  int i, 
1f30: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  j;..  assert( iD
1f40: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1f50: 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  nDb );.  db->fla
1f60: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
1f70: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72  itialized;.  for
1f80: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
1f90: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
1fa0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
1fb0: 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20  i];.    temp1 = 
1fc0: 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  pDb->tblHash;.  
1fd0: 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74    temp2 = pDb->t
1fe0: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c  rigHash;.    sql
1ff0: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44  ite3HashInit(&pD
2000: 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  b->trigHash, SQL
2010: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
2020: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2030: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
2040: 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  aFKey);.    sqli
2050: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
2060: 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20  b->idxHash);.   
2070: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2080: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
2090: 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  2); pElem; pElem
20a0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
20b0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
20c0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
20d0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
20e0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
20f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
2100: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
2110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2120: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
2130: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  2);.    sqlite3H
2140: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
2150: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
2160: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
2170: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
2180: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
2190: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
21a0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
21b0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
21c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
21d0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
21e0: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
21f0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
2200: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  b, pTab);.    }.
2210: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
2220: 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20  lear(&temp1);.  
2230: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
2240: 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65  y(db, i, DB_Sche
2250: 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69  maLoaded);.    i
2260: 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72  f( iDb>0 ) retur
2270: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
2280: 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d   iDb==0 );.  db-
2290: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
22a0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
22b0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
22c0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
22d0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
22e0: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
22f0: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
2300: 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f   remove then fro
2310: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
2320: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
2330: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
2340: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2350: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
2360: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
2370: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
2380: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
2390: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
23a0: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
23b0: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
23c0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
23d0: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
23e0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
23f0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
2400: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2410: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
2420: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2430: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
2440: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
2450: 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65  Aux && pDb->xFre
2460: 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65  eAux ) pDb->xFre
2470: 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b  eAux(pDb->pAux);
2480: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78  .      pDb->pAux
2490: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24a0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
24b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
24c0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
24d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
24e0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
24f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2500: 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61  iteFree(pDb->zNa
2510: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
2520: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2530: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2540: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
2550: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
2560: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
2570: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
2580: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
2590: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
25a0: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
25b0: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
25c0: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
25d0: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
25e0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
25f0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
2600: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
2610: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
2620: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
2630: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2640: 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  e(db->aDb);.    
2650: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
2660: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
2670: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2680: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2690: 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
26a0: 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65   occurs.  If the
26b0: 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d  re were.** schem
26c0: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
26d0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26e0: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
26f0: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69  o reset the.** i
2700: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
2710: 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74  les and reload t
2720: 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  hem from disk..*
2730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
2740: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
2750: 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62  anges(sqlite *db
2760: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ){.  if( db->fla
2770: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
2780: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
2790: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
27a0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
27b0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
27c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
27e0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
27f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
2800: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
2810: 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  es(sqlite *db){.
2820: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2830: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2840: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nges;.}../*.** R
2850: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
2860: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2870: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2880: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
2890: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
28a0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
28b0: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
28c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
28d0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
28e0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
28f0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
2900: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
2910: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
2920: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
2930: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72  hash table.  Nor
2940: 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a   does it remove.
2950: 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ** foreign keys 
2960: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e  from the sqlite.
2970: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
2980: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
2990: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
29a0: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
29b0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
29c0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
29d0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
29e0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
29f0: 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   Indices associa
2a00: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
2a10: 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20  le are unlinked 
2a20: 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a  from the "db".**
2a30: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
2a40: 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66  if db!=NULL.  If
2a50: 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63   db==NULL, indic
2a60: 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a  es attached to.*
2a70: 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  * the table are 
2a80: 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20  deleted, but it 
2a90: 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20  is assumed they 
2aa0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2ab0: 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  n.** unlinked..*
2ac0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
2ad0: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
2ae0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
2af0: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
2b00: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
2b10: 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a  *pNext;.  FKey *
2b20: 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65  pFKey, *pNextFKe
2b30: 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65  y;..  if( pTable
2b40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
2b50: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69   /* Delete all i
2b60: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
2b70: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
2b80: 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  e.  */.  for(pIn
2b90: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
2ba0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
2bb0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
2bc0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
2bd0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
2be0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d  rt( pIndex->iDb=
2bf0: 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20  =pTable->iDb || 
2c00: 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20  (pTable->iDb==0 
2c10: 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  && pIndex->iDb==
2c20: 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  1) );.    sqlite
2c30: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
2c40: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
2c50: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
2c60: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
2c70: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2c80: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73  table.  The keys
2c90: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
2ca0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  e already been u
2cb0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
2cc0: 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20   db->aFKey hash 
2cd0: 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f  table .  */.  fo
2ce0: 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e  r(pFKey=pTable->
2cf0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
2d00: 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a  Key=pNextFKey){.
2d10: 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20      pNextFKey = 
2d20: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
2d30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2d40: 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44  able->iDb<db->nD
2d50: 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
2d60: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
2d70: 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65  (&db->aDb[pTable
2d80: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20  ->iDb].aFKey,.  
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
2db0: 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65  zTo, strlen(pFKe
2dc0: 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65  y->zTo)+1)!=pFKe
2dd0: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  y );.    sqliteF
2de0: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  ree(pFKey);.  }.
2df0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
2e00: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2e10: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2e20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
2e30: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
2e40: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
2e50: 3d 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  = &pTable->aCol[
2e60: 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  i];.    sqliteFr
2e70: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
2e80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2e90: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
2ea0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
2eb0: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  l->zType);.  }. 
2ec0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2ed0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
2ee0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2ef0: 3e 61 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54  >aCol);.  if( pT
2f00: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  able->zColAff ){
2f10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2f20: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
2f30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
2f40: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62  electDelete(pTab
2f50: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  le->pSelect);.  
2f60: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2f70: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  e);.}../*.** Unl
2f80: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
2f90: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
2fa0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2fb0: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
2fc0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
2fd0: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
2fe0: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
2ff0: 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  keys..*/.static 
3000: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
3010: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
3020: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
3030: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
3040: 70 4f 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pOld;.  FKey *pF
3050: 31 2c 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69  1, *pF2;.  int i
3060: 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73   = p->iDb;.  ass
3070: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
3080: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
3090: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
30a0: 62 5b 69 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d  b[i].tblHash, p-
30b0: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
30c0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 30 29 3b 0a 20  ->zName)+1,0);. 
30d0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
30e0: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
30f0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
3100: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
3110: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
3120: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
3130: 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b  n(pF1->zTo) + 1;
3140: 0a 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74  .    pF2 = sqlit
3150: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
3160: 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46  aDb[i].aFKey, pF
3170: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  1->zTo, nTo);.  
3180: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
3190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48  {.      sqlite3H
31a0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
31b0: 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31  Db[i].aFKey, pF1
31c0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d  ->zTo, nTo, pF1-
31d0: 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d  >pNextTo);.    }
31e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c  else{.      whil
31f0: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3200: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3210: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3220: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 32   }.      if( pF2
3230: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d   ){.        pF2-
3240: 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e  >pNextTo = pF1->
3250: 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d  pNextTo;.      }
3260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3270: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
3280: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3290: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
32a0: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
32b0: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
32c0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
32d0: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20  t.** token with 
32e0: 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72  any quotations r
32f0: 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74  emoved.  Space t
3300: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
3310: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3320: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3330: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
3340: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
3350: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
3360: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
3370: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61  * Tokens are rea
3380: 6c 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  lly just pointer
3390: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
33a0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
33b0: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
33c0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
33d0: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
33e0: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
33f0: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
3400: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
3410: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
3420: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
3430: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
3440: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
3450: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
3460: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
3470: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
3480: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
3490: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
34a0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
34b0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  e(zName);.  }els
34c0: 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  e{.    zName = 0
34d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
34e0: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Name;.}../*.** O
34f0: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  pen the sqlite_m
3500: 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72  aster table stor
3510: 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e  ed in database n
3520: 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a  umber iDb for.**
3530: 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61   writing. The ta
3540: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73  ble is opened us
3550: 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f  ing cursor 0..*/
3560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65  .void sqlite3Ope
3570: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
3580: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
3590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35a0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
35b0: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  , iDb, 0);.  sql
35c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
35d0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
35e0: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a  , MASTER_ROOT);.
35f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3600: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
3610: 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f  olumns, 0, 5); /
3620: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
3630: 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f  has 5 columns */
3640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
3650: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
3660: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
3670: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
3680: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
3690: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
36a0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
36b0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
36c0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
36d0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
36e0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
36f0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
3700: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
3710: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
3720: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69  exist..*/.int fi
3730: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
3740: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
3750: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
3760: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
3770: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  i++){.    if( pN
3780: 61 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64  ame->n==strlen(d
3790: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29  b->aDb[i].zName)
37a0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 30 3d 3d   && .        0==
37b0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
37c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
37d0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
37e0: 65 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20 20 72  e->n) ){.      r
37f0: 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20  eturn i;.    }. 
3800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
3810: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
3820: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
3830: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
3840: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
3850: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
3860: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
3870: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
3880: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
3890: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
38a0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
38b0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
38c0: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
38d0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
38e0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
38f0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
3900: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
3910: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
3920: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
3930: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
3940: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
3950: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
3960: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
3970: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
3980: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
3990: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
39a0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
39b0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
39c0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
39d0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
39e0: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
39f0: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
3a00: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
3a10: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
3a20: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
3a30: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
3a40: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
3a50: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
3a60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3a70: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
3a80: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
3a90: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
3aa0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
3ab0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
3ac0: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
3ad0: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
3ae0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
3af0: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
3b00: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
3b10: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
3b20: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
3b30: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
3b40: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
3b50: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
3b60: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b80: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
3b90: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
3ba0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3bb0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
3bc0: 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
3bd0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
3be0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
3bf0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70  t.busy );.    *p
3c00: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
3c10: 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44  .    iDb = findD
3c20: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
3c30: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
3c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3c50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
3c60: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
3c70: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
3c80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3c90: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
3ca0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
3cb0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
3cc0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
3cd0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
3ce0: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
3cf0: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
3d00: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
3d10: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3d20: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
3d30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3d40: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
3d50: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
3d60: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
3d70: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
3d80: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
3d90: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
3da0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
3db0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
3dc0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
3dd0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
3de0: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
3df0: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
3e00: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
3e10: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
3e20: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
3e30: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
3e40: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
3e50: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
3e60: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
3e70: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
3e80: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
3e90: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
3ea0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
3eb0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
3ec0: 69 74 2e 62 75 73 79 20 26 26 20 30 3d 3d 73 71  it.busy && 0==sq
3ed0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
3ee0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
3ef0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
3f00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f10: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
3f20: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
3f30: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
3f40: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
3f50: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
3f60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
3f70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3f80: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
3f90: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
3fa0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
3fb0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
3fc0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
3fd0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
3fe0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
3ff0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
4000: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
4010: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4020: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
4030: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
4040: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
4050: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
4060: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
4070: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
4080: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
4090: 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b  he.** pStart tok
40a0: 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45  en is the CREATE
40b0: 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68   and pName is th
40c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
40d0: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
40e0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
40f0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
4100: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
4110: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
4120: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
4130: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
4140: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
4150: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
4160: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
4170: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
4180: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
4190: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
41a0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
41b0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
41c0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
41d0: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
41e0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
41f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4200: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
4210: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
4220: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
4230: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
4240: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
4250: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
4260: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
4270: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
4280: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
4290: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
42a0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
42b0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
42c0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
42d0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
42e0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
42f0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
4300: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
4310: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
4320: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
4330: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
4340: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
4350: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4360: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
4370: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
4380: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
4390: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
43a0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
43b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
43c0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
43d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
43e0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
43f0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
4400: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
4410: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
4420: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
4430: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
4440: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
4450: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
4460: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
4470: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
4480: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
4490: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
44a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
44b0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
44c0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
44d0: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
44e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
44f0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
4500: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
4510: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4520: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
4530: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
4540: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
4550: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61   */..  /* The ta
4560: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
4570: 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61   to create is pa
4580: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
4590: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
45a0: 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20    ** pName1 and 
45b0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
45c0: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
45d0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
45e0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
45f0: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
4600: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
4610: 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65  ;.  ** .  ** The
4620: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4630: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
4640: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
4650: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
4660: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e    ** the table n
4670: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4680: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
4690: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
46a0: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
46b0: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
46c0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
46d0: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
46e0: 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a  me2 is ""..  **.
46f0: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65    ** The call be
4700: 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61  low sets the pNa
4710: 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  me pointer to po
4720: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
4730: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a   (pName1 or.  **
4740: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4750: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4760: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4770: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44   The variable iD
4780: 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f  b is.  ** set to
4790: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
47a0: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
47b0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
47c0: 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  w is to be.  ** 
47d0: 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f  created in..  */
47e0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
47f0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
4800: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
4810: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
4820: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
4830: 6e 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  n;.  if( isTemp 
4840: 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  && iDb>1 ){.    
4850: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
4860: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
4870: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
4880: 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20   qualified */.  
4890: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
48a0: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
48b0: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
48c0: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
48d0: 69 65 64 22 29 3b 0a 20 20 20 20 70 50 61 72 73  ied");.    pPars
48e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
48f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
4900: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
4910: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
4920: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
4930: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
4940: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4950: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
4960: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
4970: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
4980: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
4990: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
49a0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
49b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
49c0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
49d0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
49e0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
49f0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
4a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
4a10: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
4a20: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
4a30: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
4a40: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
4a50: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
4a60: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
4a70: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4a80: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
4a90: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
4aa0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4ab0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
4ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
4ad0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
4ae0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4af0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
4b00: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
4b10: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
4b20: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4b30: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
4b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b50: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4b60: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
4b70: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4b80: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
4b90: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
4ba0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
4bb0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
4bc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4bd0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4be0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
4bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4c00: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4c10: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
4c20: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
4c30: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
4c40: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4c50: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4c60: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
4c70: 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e   /* Before tryin
4c80: 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65  g to create a te
4c90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d  mporary table, m
4ca0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72  ake sure the Btr
4cb0: 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64  ee for.  ** hold
4cc0: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
4cd0: 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20  bles is open..  
4ce0: 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  */.  if( isTemp 
4cf0: 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  && db->aDb[1].pB
4d00: 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
4d10: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
4d20: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4d30: 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
4d40: 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53   0, 0, MAX_PAGES
4d50: 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  , &db->aDb[1].pB
4d60: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
4d70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4d80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4d90: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
4da0: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
4db0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
4dc0: 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
4dd0: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
4de0: 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
4df0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4e00: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  rr++;.      pPar
4e10: 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
4e20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4e30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
4e40: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
4e50: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
4e60: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
4e70: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
4e80: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
4e90: 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
4ea0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
4eb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4ec0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4ed0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4ee0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
4ef0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
4f00: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
4f10: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
4f20: 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
4f30: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4f40: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4f50: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
4f60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
4f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4f80: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
4f90: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
4fa0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
4fb0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
4fc0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
4fd0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
4fe0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
4ff0: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
5000: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
5010: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a  f.  ** it does..
5020: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
5030: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
5040: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
5050: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62  ) return;.  pTab
5060: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
5070: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
5080: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
5090: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
50a0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
50b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
50c0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
50d0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
50e0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
50f0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
5100: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
5110: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
5120: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
5130: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 20  Name, 0))!=0 && 
5140: 0a 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30 20  .      ( iDb==0 
5150: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
5160: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
5170: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5180: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
5190: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
51a0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
51b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
51c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
51d0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  n;.  }.  pTable 
51e0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
51f0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
5200: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
5210: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
5220: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5230: 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  M;.    pParse->n
5240: 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Err++;.    sqlit
5250: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
5260: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5270: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
5280: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
5290: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
52a0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
52b0: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
52c0: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
52d0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
52e0: 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  ble->iDb = iDb;.
52f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
5300: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
5310: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
5320: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5330: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
5340: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
5350: 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  e;..  /* Begin g
5360: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
5370: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
5380: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
5390: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
53a0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
53b0: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
53c0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
53d0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
53e0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
53f0: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
5400: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
5410: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
5420: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
5430: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
5440: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
5450: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
5460: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
5470: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
5480: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
5490: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
54a0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
54b0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
54c0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
54d0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
54e0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
54f0: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
5500: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
5510: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
5520: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
5530: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
5540: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
5550: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
5560: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
5570: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
5580: 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20    /* Every time 
5590: 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63  a new table is c
55a0: 72 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d  reated the file-
55b0: 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e  format.    ** an
55c0: 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d  d encoding meta-
55d0: 76 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69  values are set i
55e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
55f0: 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 74  in.    ** case t
5600: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
5610: 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e 0a   table created..
5620: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5630: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5640: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66  P_Integer, db->f
5650: 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a  ile_format, 0);.
5660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5670: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
5680: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
5690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
56a0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
56b0: 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a  r, db->enc, 0);.
56c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
56d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
56e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a  okie, iDb, 4);..
56f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
5700: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
5710: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
5720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5730: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
5740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5750: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
5760: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
5770: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5780: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
5790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
57a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
57b0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
57c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
57d0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
57e0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
57f0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
5800: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
5810: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
5820: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
5830: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
5840: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
5850: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
5860: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
5870: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
5880: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
5890: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
58a0: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
58b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
58c0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
58d0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
58e0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
58f0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
5900: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
5910: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
5920: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
5930: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
5940: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
5950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
5960: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5970: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
5980: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
5990: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
59a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
59b0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
59c0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
59d0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61  3StrICmp(z, p->a
59e0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
59f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5a00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5a10: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
5a20: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
5a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
5a40: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
5a50: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
5a60: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
5a70: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
5a80: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
5a90: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
5aa0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
5ab0: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
5ac0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
5ad0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
5ae0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
5af0: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
5b00: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
5b10: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
5b20: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
5b30: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
5b40: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
5b50: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
5b60: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
5b70: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
5b80: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
5b90: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
5ba0: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
5bb0: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
5bc0: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
5bd0: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
5be0: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
5bf0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
5c00: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
5c10: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
5c20: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
5c30: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
5c40: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43  E_AFF_NONE;.  pC
5c50: 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72  ol->pColl = pPar
5c60: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
5c70: 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  l;.  p->nCol++;.
5c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5c90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5ca0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
5cb0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
5cc0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
5cd0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
5ce0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
5cf0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
5d00: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
5d10: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
5d20: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
5d30: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
5d40: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
5d50: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
5d60: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5d70: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5d80: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
5d90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
5da0: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
5db0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
5dc0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
5dd0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
5de0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
5df0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
5e00: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
5e10: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
5e20: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
5e30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5e40: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5e50: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
5e60: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
5e70: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
5e80: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5e90: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
5ea0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
5eb0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
5ec0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
5ed0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
5ee0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
5ef0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
5f00: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
5f10: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
5f20: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
5f30: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
5f40: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
5f50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
5f60: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
5f70: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
5f80: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
5f90: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
5fa0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
5fb0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
5fc0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
5fd0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
5fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
5ff0: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
6000: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54  ken *pLast){.  T
6010: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6020: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
6030: 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20  char *z, **pz;. 
6040: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
6050: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
6060: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
6070: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
6080: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
6090: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
60a0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
60b0: 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f  [i];.  pz = &pCo
60c0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  l->zType;.  n = 
60d0: 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28  pLast->n + Addr(
60e0: 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72  pLast->z) - Addr
60f0: 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73  (pFirst->z);.  s
6100: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
6110: 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20  (pz, pFirst->z, 
6120: 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a  n, 0);.  z = *pz
6130: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
6140: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a  eturn;.  for(i=j
6150: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
6160: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d      int c = z[i]
6170: 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  ;.    if( isspac
6180: 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e(c) ) continue;
6190: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b  .    z[j++] = c;
61a0: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
61b0: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
61c0: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  y = sqlite3Affin
61d0: 69 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d  ityType(z, n);.}
61e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65  ../*.** The give
61f0: 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64  n token is the d
6200: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
6210: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
6220: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65   added to.** the
6230: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
6240: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
6250: 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46  ion.  If "minusF
6260: 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74  lag" is true, it
6270: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61  .** means the va
6280: 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72  lue token was pr
6290: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
62a0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  s sign..**.** Th
62b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
62c0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
62d0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
62e0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
62f0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
6300: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
6310: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6320: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
6330: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
6340: 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69  en *pVal, int mi
6350: 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c  nusFlag){.  Tabl
6360: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6370: 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66   char **pz;.  if
6380: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
6390: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
63a0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
63b0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
63c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a  0 ) return;.  pz
63d0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   = &p->aCol[i].z
63e0: 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75  Dflt;.  if( minu
63f0: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  sFlag ){.    sql
6400: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
6410: 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d  z, "-", 1, pVal-
6420: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
6430: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
6440: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
6450: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
6460: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
6470: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a  sqlite3Dequote(*
6480: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pz);.}../*.** De
6490: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
64a0: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
64b0: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
64c0: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
64d0: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
64e0: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
64f0: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
6500: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
6510: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
6520: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
6530: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
6540: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
6550: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
6560: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
6570: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
6580: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
6590: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
65a0: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
65b0: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
65c0: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
65d0: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
65e0: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
65f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
6600: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
6610: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
6620: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
6630: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
6640: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
6650: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
6660: 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20  as the row id.  
6670: 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46  (Exception:.** F
6680: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
6690: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
66a0: 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c  older databases,
66b0: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   do not do this.
66c0: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66  ** if the file f
66d0: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75  ormat version nu
66e0: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
66f0: 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54  n 1.)  Set the T
6700: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
6710: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
6720: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
6730: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
6740: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
6750: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6760: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
6770: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
6780: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
6790: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
67a0: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
67b0: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
67c0: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
67d0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
67e0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
67f0: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
6800: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
6810: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
6820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
6830: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
6840: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
6850: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
6860: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6870: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
6880: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
6890: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
68a0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
68b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
68c0: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
68d0: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
68e0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
68f0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
6900: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
6910: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6920: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
6930: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
6940: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
6950: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
6960: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
6970: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
6980: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
6990: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
69a0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
69b0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
69c0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
69d0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
69e0: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
69f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
6a00: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
6a10: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6a20: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
6a30: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
6a40: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
6a50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6a60: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
6a70: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
6a80: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
6a90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6aa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6ab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6ac0: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
6ad0: 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol ) pTab->aCol[
6ae0: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
6af0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
6b00: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  f( pList->nExpr>
6b10: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
6b20: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
6b30: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
6b40: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
6b50: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
6b60: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
6b70: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
6b80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
6b90: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
6ba0: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  0 ){.    pTab->i
6bb0: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
6bc0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
6bd0: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73   onError;.  }els
6be0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
6bf0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
6c00: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
6c10: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29  , onError, 0, 0)
6c20: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
6c30: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
6c40: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
6c50: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
6c60: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
6c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
6c80: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
6c90: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
6ca0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
6cb0: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
6cc0: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
6cd0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
6ce0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
6cf0: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
6d00: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
6d10: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
6d20: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
6d30: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
6d40: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6d50: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
6d60: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
6d70: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
6d80: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
6d90: 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20  Col-1;..  pColl 
6da0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
6db0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
6dc0: 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20  Type, nType);.  
6dd0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c  p->aCol[i].pColl
6de0: 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20   = pColl;..  /* 
6df0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
6e00: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
6e10: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
6e20: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
6e30: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69  ,.  ** then an i
6e40: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
6e50: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
6e60: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
6e70: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74   the.  ** collat
6e80: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
6e90: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
6ea0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
6eb0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  se..  */.  for(p
6ec0: 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b  Idx = p->pIndex;
6ed0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
6ee0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73  ->pNext){.    as
6ef0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
6f00: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  umn==1 );.    if
6f10: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
6f20: 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b  [0]==i ) pIdx->k
6f30: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
6f40: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a  = pColl;.  }.}..
6f50: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64  /*.** Locate and
6f60: 20 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79   return an entry
6f70: 20 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f   from the db.aCo
6f80: 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65  llSeq hash table
6f90: 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a  . If the entry.*
6fa0: 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7a  * specified by z
6fb0: 4e 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69  Name and nName i
6fc0: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20  s not found and 
6fd0: 70 61 72 61 6d 65 74 65 72 20 27 63 72 65 61 74  parameter 'creat
6fe0: 65 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74  e' is.** true, t
6ff0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
7000: 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
7010: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
7020: 2a 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65  *.** Each pointe
7030: 72 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  r stored in the 
7040: 73 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71  sqlite3.aCollSeq
7050: 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74   hash table cont
7060: 61 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79  ains an.** array
7070: 20 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65   of three CollSe
7080: 71 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  q structures. Th
7090: 65 20 66 69 72 73 74 20 69 73 20 74 68 65 20 63  e first is the c
70a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
70b0: 65 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20  e.** prefferred 
70c0: 66 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73  for UTF-8, the s
70d0: 65 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20  econd UTF-16le, 
70e0: 61 6e 64 20 74 68 65 20 74 68 69 72 64 20 55 54  and the third UT
70f0: 46 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74  F-16be..**.** St
7100: 6f 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ored immediately
7110: 20 61 66 74 65 72 20 74 68 65 20 74 68 72 65 65   after the three
7120: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7130: 6e 63 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f  nces is a copy o
7140: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  f.** the collati
7150: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
7160: 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  . A pointer to t
7170: 68 69 73 20 73 74 72 69 6e 67 20 69 73 20 73 74  his string is st
7180: 6f 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20  ored in.** each 
7190: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
71a0: 63 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ce structure..*/
71b0: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
71c0: 2a 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74  * findCollSeqEnt
71d0: 72 79 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  ry(.  sqlite *db
71e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
71f0: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61  zName,.  int nNa
7200: 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65  me,.  int create
7210: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
7220: 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d  Coll;.  if( nNam
7230: 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74  e<0 ) nName = st
7240: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  rlen(zName);.  p
7250: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
7260: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
7270: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
7280: 6d 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70  me);..  if( 0==p
7290: 43 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29  Coll && create )
72a0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
72b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69  liteMalloc( 3*si
72c0: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e  zeof(*pColl) + n
72d0: 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20  Name + 1 );.    
72e0: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
72f0: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d     pColl[0].zNam
7300: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7310: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7320: 6c 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[0].enc = SQLIT
7330: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43  E_UTF8;.      pC
7340: 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[1].zName = (
7350: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
7360: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e  .      pColl[1].
7370: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
7380: 31 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c  16LE;.      pCol
7390: 6c 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68  l[2].zName = (ch
73a0: 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20  ar*)&pColl[3];. 
73b0: 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e       pColl[2].en
73c0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
73d0: 42 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  BE;.      memcpy
73e0: 28 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c  (pColl[0].zName,
73f0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
7400: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a        pColl[0].z
7410: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
7420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61  .      sqlite3Ha
7430: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43  shInsert(&db->aC
7440: 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d  ollSeq, pColl[0]
7450: 2e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70  .zName, nName, p
7460: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
7470: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
7480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
7490: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
74a0: 20 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   to a UTF-8 enco
74b0: 64 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65  ded string nName
74c0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20   bytes long..** 
74d0: 52 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53  Return the CollS
74e0: 65 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  eq* pointer for 
74f0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7500: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61  quence named zNa
7510: 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  me.** for the en
7520: 63 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f  coding 'enc' fro
7530: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27  m the database '
7540: 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  db'..**.** If th
7550: 65 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65  e entry specifie
7560: 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61  d is not found a
7570: 6e 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74  nd 'create' is t
7580: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
7590: 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e   a.** new entry.
75a0: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
75b0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c  rn NULL..*/.Coll
75c0: 53 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  Seq *sqlite3Find
75d0: 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74  CollSeq(.  sqlit
75e0: 65 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c  e *db,.  u8 enc,
75f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7600: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
7610: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
7620: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
7630: 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65  oll = findCollSe
7640: 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65  qEntry(db, zName
7650: 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29  , nName, create)
7660: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 20  ;.  if( pColl ) 
7670: 73 77 69 74 63 68 28 20 65 6e 63 20 29 7b 0a 20  switch( enc ){. 
7680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
7690: 54 46 38 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  TF8:.      break
76a0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
76b0: 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
76c0: 20 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b   pColl = &pColl[
76d0: 31 5d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1];.      break;
76e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
76f0: 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20  _UTF16BE:.      
7700: 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b 32  pColl = &pColl[2
7710: 5d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ];.      break;.
7720: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20      default: .  
7730: 20 20 20 20 61 73 73 65 72 74 28 21 22 43 61 6e      assert(!"Can
7740: 6e 6f 74 20 68 61 70 70 65 6e 22 29 3b 0a 20 20  not happen");.  
7750: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
7760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
7770: 65 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  e the 'collation
7780: 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63   needed' callbac
7790: 6b 20 74 6f 20 72 65 71 75 65 73 74 20 61 20 63  k to request a c
77a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
77b0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
77c0: 62 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64 69  base text encodi
77d0: 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65  ng of name zName
77e0: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
77f0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  ** If the collat
7800: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a  ion sequence.*/.
7810: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c  static void call
7820: 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74  CollNeeded(sqlit
7830: 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  e *db, const cha
7840: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
7850: 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ame){.  assert( 
7860: 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64  !db->xCollNeeded
7870: 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65   || !db->xCollNe
7880: 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20  eded16 );.  if( 
7890: 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20  nName<0 ) nName 
78a0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
78b0: 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c  .  if( db->xColl
78c0: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 63 68  Needed ){.    ch
78d0: 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20  ar *zExternal = 
78e0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 4e  sqliteStrNDup(zN
78f0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
7900: 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20   if( !zExternal 
7910: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62  ) return;.    db
7920: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62  ->xCollNeeded(db
7930: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
7940: 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65  , db, (int)db->e
7950: 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  nc, zExternal);.
7960: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7970: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20  External);.  }. 
7980: 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   if( db->xCollNe
7990: 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20 63 68  eded16 ){.    ch
79a0: 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72  ar const *zExter
79b0: 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nal;.    sqlite3
79c0: 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73  _value *pTmp = s
79d0: 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65  qlite3GetTransie
79e0: 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20 20 20  ntValue(db);.   
79f0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
7a00: 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e  Str(pTmp, -1, zN
7a10: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
7a20: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7a30: 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20  ;.    zExternal 
7a40: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
7a50: 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f  xt(pTmp, SQLITE_
7a60: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
7a70: 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c    if( !zExternal
7a80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
7a90: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
7aa0: 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64  (db->pCollNeeded
7ab0: 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62  Arg, db, (int)db
7ac0: 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c  ->enc, zExternal
7ad0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7ae0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7af0: 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 63 6f  called if the co
7b00: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
7b10: 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76 65 72  fails to deliver
7b20: 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20   a.** collation 
7b30: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  function in the 
7b40: 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20 62 75  best encoding bu
7b50: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 6f  t there may be o
7b60: 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  ther versions.**
7b70: 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   of this collati
7b80: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72  on function (for
7b90: 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f   other text enco
7ba0: 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62 6c 65  dings) available
7bb0: 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  . Use one.** of 
7bc0: 74 68 65 73 65 20 69 6e 73 74 65 61 64 20 69 66  these instead if
7bd0: 20 74 68 65 79 20 65 78 69 73 74 2e 20 41 76 6f   they exist. Avo
7be0: 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20 55  id a UTF-8 <-> U
7bf0: 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e  TF-16 conversion
7c00: 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e   if.** possible.
7c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
7c20: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61 72 73  ynthCollSeq(Pars
7c30: 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53  e *pParse, CollS
7c40: 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f  eq *pColl){.  Co
7c50: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20  llSeq *pColl2;. 
7c60: 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c   char *z = pColl
7c70: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ->zName;.  int n
7c80: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
7c90: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
7ca0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
7cb0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
7cc0: 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20 7b 20 53   u8 aEnc[] = { S
7cd0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53  QLITE_UTF16BE, S
7ce0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 53  QLITE_UTF16LE, S
7cf0: 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b 0a 20 20  QLITE_UTF8 };.  
7d00: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b  for(i=0; i<3; i+
7d10: 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 32 20 3d  +){.    pColl2 =
7d20: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
7d30: 53 65 71 28 64 62 2c 20 61 45 6e 63 5b 69 5d 2c  Seq(db, aEnc[i],
7d40: 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 69   z, n, 0);.    i
7d50: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21  f( pColl2->xCmp!
7d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 ){.      memc
7d70: 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32  py(pColl, pColl2
7d80: 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  , sizeof(CollSeq
7d90: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
7da0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
7db0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  }.  }.  if( pPar
7dc0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
7dd0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
7de0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
7df0: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
7e00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7e10: 63 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  ce: ", .        
7e20: 2d 31 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  -1, z, n, 0);.  
7e30: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  }.  pParse->nErr
7e40: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ++;.  return SQL
7e50: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
7e60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7e70: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   is called on a 
7e80: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7e90: 63 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ce before it is 
7ea0: 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b  used to.** check
7eb0: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 66 69   that it is defi
7ec0: 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65  ned. An undefine
7ed0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
7ee0: 65 6e 63 65 20 65 78 69 73 74 73 20 77 68 65 6e  ence exists when
7ef0: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 69  .** a database i
7f00: 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f  s loaded that co
7f10: 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65  ntains reference
7f20: 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  s to collation s
7f30: 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74  equences.** that
7f40: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64   have not been d
7f50: 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65  efined by sqlite
7f60: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
7f70: 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20  on() etc..**.** 
7f80: 49 66 20 72 65 71 75 69 72 65 64 2c 20 74 68 69  If required, thi
7f90: 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  s routine calls 
7fa0: 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e  the 'collation n
7fb0: 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20  eeded' callback 
7fc0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20  to.** request a 
7fd0: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68  definition of th
7fe0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
7ff0: 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f  ence. If this do
8000: 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20  esn't work, .** 
8010: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  an equivalent co
8020: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8030: 20 74 68 61 74 20 75 73 65 73 20 61 20 74 65 78   that uses a tex
8040: 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65  t encoding diffe
8050: 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  rent.** from the
8060: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
8070: 73 20 73 75 62 73 74 69 74 75 74 65 64 2c 20 69  s substituted, i
8080: 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62  f one is availab
8090: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
80a0: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50  e3CheckCollSeq(P
80b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
80c0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
80d0: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70   if( pColl && !p
80e0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
80f0: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
8100: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
8110: 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  is type for this
8120: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67   encoding is reg
8130: 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20  istered..    ** 
8140: 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69  Call the collati
8150: 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65  on factory to se
8160: 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70  e if it can supp
8170: 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a  ly us with one..
8180: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43      */.    callC
8190: 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65  ollNeeded(pParse
81a0: 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ->db, pColl->zNa
81b0: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c  me, strlen(pColl
81c0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69  ->zName));.    i
81d0: 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  f( !pColl->xCmp 
81e0: 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  && synthCollSeq(
81f0: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
8200: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8210: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
8220: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8230: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8240: 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
8250: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66  CheckCollSeq() f
8260: 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67  or all collating
8270: 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e   sequences in an
8280: 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72   index,.** in or
8290: 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68  der to verify th
82a0: 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73  at all the neces
82b0: 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73  sary collating s
82c0: 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20  equences are.** 
82d0: 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  loaded..*/.int s
82e0: 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78  qlite3CheckIndex
82f0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
8300: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
8310: 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20  dx){.  if( pIdx 
8320: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
8330: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
8340: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
8350: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
8360: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
8370: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65  pParse, pIdx->ke
8380: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20  yInfo.aColl[i]) 
8390: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
83a0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
83b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
83c0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
83d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
83e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
83f0: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
8400: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
8410: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
8420: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
8430: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
8440: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
8450: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
8460: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
8470: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
8480: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
8490: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
84a0: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
84b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
84c0: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
84d0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
84e0: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
84f0: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
8500: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
8510: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
8520: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
8530: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
8540: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
8550: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
8560: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
8570: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
8580: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
8590: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
85a0: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
85b0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
85c0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
85d0: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
85e0: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
85f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
8600: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
8610: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
8620: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
8630: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  o.** pParse..*/.
8640: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
8650: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
8660: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
8670: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
8680: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38  int nName){.  u8
8690: 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   enc = pParse->d
86a0: 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69  b->enc;.  u8 ini
86b0: 74 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e  tbusy = pParse->
86c0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
86d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
86e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
86f0: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
8700: 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61   enc, zName, nNa
8710: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
8720: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
8730: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
8740: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
8750: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
8760: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
8770: 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  is type for this
8780: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67   encoding is reg
8790: 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20  istered..    ** 
87a0: 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69  Call the collati
87b0: 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65  on factory to se
87c0: 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70  e if it can supp
87d0: 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a  ly us with one..
87e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43      */.    callC
87f0: 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65  ollNeeded(pParse
8800: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  ->db, zName, nNa
8810: 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  me);.    pColl =
8820: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
8830: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Seq(pParse->db, 
8840: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
8850: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
8860: 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e  Coll && !pColl->
8870: 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  xCmp ){.      /*
8880: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   There may be a 
8890: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  version of the c
88a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
88b0: 65 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  e that requires.
88c0: 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61        ** transla
88d0: 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63  tion between enc
88e0: 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66  odings. Search f
88f0: 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e 74 68  or it with synth
8900: 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20  CollSeq()..     
8910: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79   */.      if( sy
8920: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
8930: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
8940: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
8950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8960: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e  ..  /* If nothin
8970: 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64  g has been found
8980: 2c 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f  , write the erro
8990: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70  r message into p
89a0: 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21  Parse */.  if( !
89b0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
89c0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
89d0: 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Cmp) ){.    if( 
89e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
89f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8a00: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
8a10: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
8a20: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
8a30: 73 65 71 75 65 6e 63 65 3a 20 22 2c 20 2d 31 2c  sequence: ", -1,
8a40: 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  .          zName
8a50: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , nName, 0);.   
8a60: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
8a70: 45 72 72 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 6c  Err++;.    pColl
8a80: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8a90: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f  rn pColl;.}..../
8aa0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8ab0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8ac0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8ad0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
8ae0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
8af0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
8b00: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
8b10: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
8b20: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
8b30: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74  nt nType){.  int
8b40: 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20   n, i;.  struct 
8b50: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
8b60: 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77   *zSub;  /* Keyw
8b70: 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67 20 74  ords substring t
8b80: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
8b90: 20 20 20 20 63 68 61 72 20 6e 53 75 62 3b 20 20      char nSub;  
8ba0: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
8bb0: 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20   of zSub */.    
8bc0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
8bd0: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
8be0: 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d  o return if it m
8bf0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75  atches */.  } su
8c00: 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20  bstrings[] = {. 
8c10: 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53     {"INT",  3, S
8c20: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8c30: 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c  R},.    {"CHAR",
8c40: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
8c50: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42  EXT},.    {"CLOB
8c60: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
8c70: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45  _TEXT},.    {"TE
8c80: 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  XT", 4, SQLITE_A
8c90: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
8ca0: 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45  BLOB", 4, SQLITE
8cb0: 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b  _AFF_NONE},.  };
8cc0: 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30  ..  if( nType==0
8cd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8ce0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
8cf0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
8d00: 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e  <sizeof(substrin
8d10: 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74  gs)/sizeof(subst
8d20: 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  rings[0]); i++){
8d30: 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75  .    int c1 = su
8d40: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62  bstrings[i].zSub
8d50: 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  [0];.    int c2 
8d60: 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20  = tolower(c1);. 
8d70: 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e     int limit = n
8d80: 54 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67  Type - substring
8d90: 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63  s[i].nSub;.    c
8da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
8db0: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75  ubstrings[i].zSu
8dc0: 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  b;.    for(n=0; 
8dd0: 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a  n<=limit; n++){.
8de0: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54        int c = zT
8df0: 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66  ype[n];.      if
8e00: 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63  ( (c==c1 || c==c
8e10: 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2).             
8e20: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
8e30: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c  NICmp(&zType[n],
8e40: 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69   z, substrings[i
8e50: 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20  ].nSub) ){.     
8e60: 20 20 20 72 65 74 75 72 6e 20 73 75 62 73 74 72     return substr
8e70: 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79  ings[i].affinity
8e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8ea0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
8eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75  .}../*.** Come u
8ec0: 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e  p with a new ran
8ed0: 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  dom value for th
8ee0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
8ef0: 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74    Make sure.** t
8f00: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
8f10: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
8f20: 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  he old..**.** Th
8f30: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
8f40: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8f50: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
8f60: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
8f70: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
8f80: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
8f90: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
8fa0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
8fb0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
8fc0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
8fd0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
8fe0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
8ff0: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9000: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9010: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9020: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9030: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
9040: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
9050: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
9060: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
9070: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
9080: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
9090: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
90a0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
90b0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
90c0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
90d0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
90e0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
90f0: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9100: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9110: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9120: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9130: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9140: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9150: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9160: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9170: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9180: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
9190: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
91a0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
91b0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
91c0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
91d0: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64  Cookie(sqlite *d
91e0: 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  b, Vdbe *v, int 
91f0: 69 44 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  iDb){.  unsigned
9200: 20 63 68 61 72 20 72 3b 0a 20 20 69 6e 74 20 2a   char r;.  int *
9210: 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20  pSchemaCookie = 
9220: 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  &(db->aDb[iDb].s
9230: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a  chema_cookie);..
9240: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
9250: 65 73 73 28 31 2c 20 26 72 29 3b 0a 20 20 2a 70  ess(1, &r);.  *p
9260: 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 2a  SchemaCookie = *
9270: 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 2b 20  pSchemaCookie + 
9280: 72 20 2b 20 31 3b 0a 20 20 64 62 2d 3e 66 6c 61  r + 1;.  db->fla
9290: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
92a0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
92b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
92c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2a 70  , OP_Integer, *p
92d0: 53 63 68 65 6d 61 43 6f 6f 6b 69 65 2c 20 30 29  SchemaCookie, 0)
92e0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
92f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
9300: 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d  okie, iDb, 0);.}
9310: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
9320: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
9330: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
9340: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
9350: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
9360: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
9370: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9380: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
9390: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
93a0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
93b0: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f  l terminator..*/
93c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
93d0: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
93e0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
93f0: 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65  .  int needQuote
9400: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b   = 0;.  for(n=0;
9410: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
9420: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27      if( *z=='\''
9430: 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f   ){ n++; needQuo
9440: 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  te=1; }.  }.  re
9450: 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f  turn n + needQuo
9460: 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  te*2;.}../*.** W
9470: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
9480: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
9490: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
94a0: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
94b0: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
94c0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
94d0: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
94e0: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
94f0: 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e  Idx, char *zIden
9500: 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  t){.  int i, j, 
9510: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
9520: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
9530: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
9540: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
9550: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
9560: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
9570: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
9580: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
9590: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
95a0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
95b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
95c0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
95d0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
95e0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
95f0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
9600: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66  i++] = '\'';.  f
9610: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
9620: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
9630: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
9640: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
9650: 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b  j]=='\'' ) z[i++
9660: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20  ] = '\'';.  }.  
9670: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
9680: 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[i++] = '\'';. 
9690: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
96a0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
96b0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
96c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
96d0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
96e0: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
96f0: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
9700: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
9710: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
9720: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
9730: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
9740: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
9750: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
9760: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
9770: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
9780: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
9790: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
97a0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
97b0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
97c0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
97d0: 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  End;.  n = 0;.  
97e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
97f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ol; i++){.    n 
9800: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
9810: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
9820: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 43 6f  ;.    if( p->aCo
9830: 6c 5b 69 5d 2e 7a 54 79 70 65 20 29 7b 0a 20 20  l[i].zType ){.  
9840: 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e      n += (strlen
9850: 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  (p->aCol[i].zTyp
9860: 65 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  e) + 1);.    }. 
9870: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
9880: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
9890: 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20  .  if( n<40 ){. 
98a0: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
98b0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
98c0: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
98d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
98e0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
98f0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
9900: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
9910: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
9920: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
9930: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
9940: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
9950: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
9960: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
9970: 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d  (zStmt, p->iDb==
9980: 31 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50  1 ? "CREATE TEMP
9990: 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41   TABLE " : "CREA
99a0: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
99b0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
99c0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
99d0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
99e0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
99f0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30  = '(';.  for(i=0
9a00: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
9a10: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
9a20: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
9a30: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
9a40: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
9a50: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
9a60: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
9a70: 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  , &k, p->aCol[i]
9a80: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
9a90: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70   p->aCol[i].zTyp
9aa0: 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  e ){.      zStmt
9ab0: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
9ac0: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
9ad0: 5b 6b 5d 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  [k], p->aCol[i].
9ae0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6b 20  zType);.      k 
9af0: 2b 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 61 43 6f  += strlen(p->aCo
9b00: 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20  l[i].zType);.   
9b10: 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28   }.  }.  strcpy(
9b20: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29  &zStmt[k], zEnd)
9b30: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
9b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9b50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9b60: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
9b70: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
9b80: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
9b90: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9ba0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
9bb0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
9bc0: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
9bd0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
9be0: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
9bf0: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
9c00: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
9c10: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
9c20: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
9c30: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
9c40: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
9c50: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
9c60: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
9c70: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
9c80: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
9c90: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
9ca0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
9cb0: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
9cc0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
9cd0: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
9ce0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
9cf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
9d00: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
9d10: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
9d20: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
9d30: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
9d40: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
9d50: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
9d60: 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68  y changes, so th
9d70: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
9d80: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
9d90: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
9da0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9db0: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
9dc0: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
9dd0: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
9de0: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
9df0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
9e00: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
9e10: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
9e20: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
9e30: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
9e40: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
9e50: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
9e60: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
9e70: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
9e80: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
9e90: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
9ea0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
9eb0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9ec0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
9ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
9ee0: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
9ef0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  arse, Token *pEn
9f00: 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  d, Select *pSele
9f10: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ct){.  Table *p;
9f20: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
9f30: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
9f40: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
9f50: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
9f60: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
9f70: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
9f80: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
9f90: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9fa0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
9fb0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
9fc0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
9fd0: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
9fe0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
9ff0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
a000: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
a010: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
a020: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
a030: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
a040: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
a050: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
a060: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
a070: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
a080: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
a090: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
a0a0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
a0b0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
a0c0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
a0d0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
a0e0: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
a0f0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
a100: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
a110: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
a120: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
a130: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
a140: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
a150: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
a160: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
a170: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
a180: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
a190: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
a1a0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
a1b0: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
a1c0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
a1d0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
a1e0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
a1f0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
a200: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
a210: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
a220: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
a230: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
a240: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
a250: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
a260: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
a270: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
a280: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
a290: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
a2a0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
a2b0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
a2c0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
a2d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
a2e0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20     Vdbe *v;..   
a2f0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
a300: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
a310: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
a320: 72 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  rn;..    if( p->
a330: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
a340: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
a350: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
a360: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a370: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
a380: 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63 68  , 0, p->iDb, (ch
a390: 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33  ar*)&p->tnum, P3
a3a0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
a3b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
a3c0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   view */.      s
a3d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a3e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
a3f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
a400: 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20  p->tnum = 0;..  
a410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a420: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
a430: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  0, 0);..    /* I
a440: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
a450: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
a460: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
a470: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
a480: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
a490: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
a4a0: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
a4b0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
a4c0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
a4d0: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
a4e0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
a4f0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
a500: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
a510: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
a520: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
a530: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
a540: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
a550: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
a560: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
a570: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
a580: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
a590: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
a5a0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
a5b0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
a5c0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
a5d0: 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  elTab;.      sql
a5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a5f0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
a600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a610: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
a620: 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29  eger, p->iDb, 0)
a630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a640: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
a650: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b  penWrite, 1, 0);
a660: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
a670: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
a680: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
a690: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
a6a0: 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30  T_Table, 1, 0, 0
a6b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
a6c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a6d0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
a6e0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
a6f0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
a700: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
a710: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
a720: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
a730: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b  se, 0, pSelect);
a740: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
a750: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
a760: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a770: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
a780: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
a790: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
a7a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
a7b0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
a7c0: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
a7d0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
a7e0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
a7f0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
a800: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
a810: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
a820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a830: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
a840: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
a850: 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c  ->iDb);..    sql
a860: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
a870: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
a880: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22   p->pSelect==0?"
a890: 74 61 62 6c 65 22 3a 22 76 69 65 77 22 2c 50 33  table":"view",P3
a8a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
a8b0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a8c0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
a8d0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , p->zName, 0);.
a8e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
a8f0: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
a900: 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65  , 0, 0, p->zName
a910: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a920: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a930: 5f 50 75 6c 6c 2c 20 33 2c 20 30 29 3b 0a 0a 20  _Pull, 3, 0);.. 
a940: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
a950: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
a960: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
a970: 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  t(p);.      n = 
a980: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
a990: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
a9a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a9b0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
a9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a9d0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
a9e0: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
a9f0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
aa00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
aa10: 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  ( p->pSelect ){.
aa20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
aa30: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
aa40: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45  ing8, 0, 0, "CRE
aa50: 41 54 45 20 56 49 45 57 20 22 2c 20 50 33 5f 53  ATE VIEW ", P3_S
aa60: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  TATIC);.      }e
aa70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
aa80: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
aa90: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
aaa0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
aab0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
aac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
aad0: 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20  rt( pEnd!=0 );. 
aae0: 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45       n = Addr(pE
aaf0: 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50  nd->z) - Addr(pP
ab00: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
ab10: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  .z) + 1;.      s
ab20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ab30: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
ab40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
ab50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
ab60: 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73  v, -1, pParse->s
ab70: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  NameToken.z, n);
ab80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ab90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
aba0: 6e 63 61 74 38 2c 20 32 2c 20 30 29 3b 0a 20 20  ncat8, 2, 0);.  
abb0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
abc0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
abd0: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22  eRecord, 5, 0, "
abe0: 74 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49  tttit", P3_STATI
abf0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
ac00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
ac10: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
ac20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62 21  .    if( p->iDb!
ac30: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
ac40: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
ac50: 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a  db, v, p->iDb);.
ac60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ac70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ac80: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a  _Close, 0, 0);..
ac90: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
aca0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
acb0: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
acc0: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
acd0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
ace0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
acf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
ad00: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
ad10: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20  ->explain==0 && 
ad20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
ad30: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
ad40: 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  ld;.    FKey *pF
ad50: 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Key;.    pOld = 
ad60: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
ad70: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
ad80: 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a 20 20 20  b].tblHash, .   
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
adb0: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
adc0: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69  me)+1, p);.    i
add0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
ade0: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
adf0: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
ae00: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
ae10: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
ae20: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  t() */.      ret
ae30: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  urn;.    }.    f
ae40: 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65  or(pFKey=p->pFKe
ae50: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
ae60: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
ae70: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
ae80: 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d   = strlen(pFKey-
ae90: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
aea0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
aeb0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
aec0: 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  d(&db->aDb[p->iD
aed0: 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  b].aFKey, pFKey-
aee0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
aef0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
af00: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
af10: 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65  iDb].aFKey, pFKe
af20: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b  y->zTo, nTo, pFK
af30: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
af40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
af50: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
af60: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
af70: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
af80: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
af90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
afa0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
afb0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
afc0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
afd0: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
afe0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
aff0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
b000: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
b010: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b020: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
b030: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
b040: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
b050: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
b060: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
b070: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
b080: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b090: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b0a0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
b0b0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
b0c0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
b0d0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
b0e0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
b0f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b100: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
b110: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
b120: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
b130: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
b140: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
b150: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
b160: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
b170: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
b180: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
b190: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  st char *z;.  To
b1a0: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
b1b0: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
b1c0: 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c  n *pName;..  sql
b1d0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
b1e0: 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70  Parse, pBegin, p
b1f0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
b200: 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d  sTemp, 1);.  p =
b210: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b220: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
b230: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
b240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
b250: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
b260: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
b270: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f    }.  sqlite3Two
b280: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
b290: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
b2a0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
b2b0: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
b2c0: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d  sFix, pParse, p-
b2d0: 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e  >iDb, "view", pN
b2e0: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
b2f0: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
b300: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
b310: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
b320: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
b330: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
b340: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
b350: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
b360: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
b370: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
b380: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
b390: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
b3a0: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
b3b0: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
b3c0: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
b3d0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
b3e0: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
b3f0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
b400: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
b410: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
b420: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
b430: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
b440: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
b450: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
b460: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
b470: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b480: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  p(pSelect);.  sq
b490: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
b4a0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
b4b0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
b4c0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
b4d0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
b4e0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
b4f0: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
b500: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
b510: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
b520: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
b530: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
b540: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
b550: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
b560: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
b570: 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
b580: 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  !=0 && sEnd.z[0]
b590: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
b5a0: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
b5b0: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
b5c0: 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20  .  n = sEnd.z - 
b5d0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d  pBegin->z;.  z =
b5e0: 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
b5f0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e  ile( n>0 && (z[n
b600: 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70  -1]==';' || issp
b610: 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20  ace(z[n-1])) ){ 
b620: 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
b630: 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
b640: 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
b650: 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
b660: 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
b670: 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
b680: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
b690: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
b6a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45  able(pParse, &sE
b6b0: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
b6c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  ;.}../*.** The T
b6d0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
b6e0: 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
b6f0: 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
b700: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
b710: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
b720: 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
b730: 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
b740: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
b750: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
b760: 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
b770: 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
b780: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
b790: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
b7a0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
b7b0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
b7c0: 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
b7d0: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
b7e0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
b7f0: 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20  EList;.  Select 
b800: 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a  *pSel;.  Table *
b810: 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e  pSelTab;.  int n
b820: 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Err = 0;..  asse
b830: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20  rt( pTable );.. 
b840: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
b850: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
b860: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
b870: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
b880: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
b890: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
b8a0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
b8b0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
b8c0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
b8d0: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
b8e0: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
b8f0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
b900: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
b910: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
b920: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
b930: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
b940: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
b950: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
b960: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
b970: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
b980: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
b990: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
b9a0: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
b9b0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
b9c0: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
b9d0: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
b9e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
b9f0: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
ba00: 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72  tually, this err
ba10: 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65  or is caught pre
ba20: 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74  viously and so t
ba30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
ba40: 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c  t.  ** should al
ba50: 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20  ways fail.  But 
ba60: 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74  we will leave it
ba70: 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74   in place just t
ba80: 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a  o be safe..  */.
ba90: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
baa0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
bab0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bac0: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
bad0: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
bae0: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
baf0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
bb00: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
bb10: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
bb20: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
bb30: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
bb40: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
bb50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
bb60: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20  ble->pSelect ); 
bb70: 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74  /* If nCol==0, t
bb80: 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20  hen pTable must 
bb90: 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70  be a VIEW */.  p
bba0: 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53  Sel = pTable->pS
bbb0: 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74  elect;..  /* Not
bbc0: 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
bbd0: 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
bbe0: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
bbf0: 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
bc00: 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
bc10: 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42  in this list.  B
bc20: 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ut we will need 
bc30: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c  to restore the l
bc40: 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f  ist.  ** back to
bc50: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
bc60: 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65  nfiguration afte
bc70: 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61  rwards, so we sa
bc80: 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a  ve a copy of.  *
bc90: 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  * the original i
bca0: 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20  n pEList..  */. 
bcb0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e   pEList = pSel->
bcc0: 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e  pEList;.  pSel->
bcd0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
bce0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
bcf0: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
bd00: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
bd10: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
bd20: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
bd30: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
bd40: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
bd50: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
bd60: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
bd70: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
bd80: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
bd90: 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66  , 0, pSel);.  if
bda0: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
bdb0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
bdc0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
bdd0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
bde0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
bdf0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
be00: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
be10: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
be20: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  l = 0;.    pSelT
be30: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
be40: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
be50: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
be60: 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  ;.    DbSetPrope
be70: 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  rty(pParse->db, 
be80: 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f  pTable->iDb, DB_
be90: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20  UnresetViews);. 
bea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
beb0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
bec0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
bed0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62  sqlite3SelectUnb
bee0: 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c  ind(pSel);.  sql
bef0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
bf00: 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29  te(pSel->pEList)
bf10: 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ;.  pSel->pEList
bf20: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74   = pEList;.  ret
bf30: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
bf40: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
bf50: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
bf60: 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65   the VIEW pTable
bf70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
bf80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
bf90: 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65  henever any othe
bfa0: 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  r table or view 
bfb0: 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20  is modified..** 
bfc0: 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20  The view passed 
bfd0: 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
bfe0: 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64  e might depend d
bff0: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
c000: 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20  ectly.** on the 
c010: 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65  modified or dele
c020: 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20  ted table so we 
c030: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68  need to clear th
c040: 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  e old column.** 
c050: 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68  names so that th
c060: 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d  ey will be recom
c070: 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
c080: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
c090: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
c0a0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
c0b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
c0c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
c0d0: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 26 26  rt( pTable!=0 &&
c0e0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
c0f0: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
c100: 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61  , pCol=pTable->a
c110: 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  Col; i<pTable->n
c120: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
c130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
c140: 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  e(pCol->zName);.
c150: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
c160: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
c170: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
c180: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  ->zType);.  }.  
c190: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
c1a0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62  e->aCol);.  pTab
c1b0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
c1c0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
c1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
c1e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
c1f0: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
c200: 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
c210: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
c220: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
c230: 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c  tAll(sqlite *db,
c240: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
c250: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
c260: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
c270: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
c280: 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
c290: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
c2a0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
c2b0: 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68  aDb[idx].tblHash
c2c0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
c2d0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
c2e0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
c2f0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
c300: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
c310: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
c320: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43  sqliteViewResetC
c330: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29  olumnNames(pTab)
c340: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
c350: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
c360: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
c370: 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 23 69 66 20  tViews);.}..#if 
c380: 30 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  0./*.** Given a 
c390: 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61  token, look up a
c3a0: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74   table with that
c3b0: 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66   name.  If not f
c3c0: 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61  ound, leave.** a
c3d0: 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20  n error for the 
c3e0: 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61  parser to find a
c3f0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
c400: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
c410: 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  3TableFromToken(
c420: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
c430: 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63  oken *pTok){.  c
c440: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61  har *zName;.  Ta
c450: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61  ble *pTab;.  zNa
c460: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
c470: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b  FromToken(pTok);
c480: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
c490: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54  ) return 0;.  pT
c4a0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
c4b0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
c4c0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  , zName, 0);.  s
c4d0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
c4e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
c4f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c500: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c510: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
c520: 54 22 2c 20 70 54 6f 6b 29 3b 0a 20 20 20 20 70  T", pTok);.    p
c530: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
c540: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
c550: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 23 65 6e  turn pTab;.}.#en
c560: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
c570: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c580: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
c590: 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
c5a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
c5b0: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
c5c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
c5d0: 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
c5e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
c5f0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
c600: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
c610: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
c620: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
c630: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
c640: 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  t base;.  sqlite
c650: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c660: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
c670: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
c680: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
c690: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
c6a0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
c6b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  e;.  assert( pNa
c6c0: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
c6d0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
c6e0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
c6f0: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
c700: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
c710: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20  ].zDatabase);.. 
c720: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
c730: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c740: 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  ble;.  iDb = pTa
c750: 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  b->iDb;.  assert
c760: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
c770: 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64  db->nDb );.#ifnd
c780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c790: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
c7a0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
c7b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c7c0: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
c7d0: 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  LE(pTab->iDb);. 
c7e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c7f0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
c800: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
c810: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
c820: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
c830: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
c840: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
c850: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
c860: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
c870: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
c880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
c890: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
c8a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
c8b0: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
c8c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c8d0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
c8e0: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
c8f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
c900: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
c910: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
c920: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
c930: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
c940: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
c950: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
c960: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
c970: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
c980: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
c990: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
c9a0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
c9b0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c9c0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
c9d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
c9e0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
c9f0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
ca00: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
ca10: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
ca20: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
ca30: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
ca40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
ca50: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
ca60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ca70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ca80: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
ca90: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
caa0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
cab0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
cac0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
cad0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
cae0: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
caf0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
cb00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
cb10: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
cb20: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
cb30: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
cb40: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
cb50: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
cb60: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
cb70: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
cb80: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
cb90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
cba0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
cbb0: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
cbc0: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
cbd0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
cbe0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
cbf0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  p_table;.  }..  
cc00: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
cc10: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
cc20: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
cc30: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
cc40: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
cc50: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
cc60: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
cc70: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
cc80: 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f  c VdbeOpList dro
cc90: 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  pTable[] = {.   
cca0: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
ccb0: 20 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c      0, ADDR(13),
ccc0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ccd0: 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30  String8,    0, 0
cce0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
ccf0: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
cd00: 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
cd10: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
cd20: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
cd30: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
cd40: 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20   0}, /* 3 */.   
cd50: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
cd60: 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
cd70: 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d   0}, /* sqlite_m
cd80: 61 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a  aster.tbl_name *
cd90: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  /.      { OP_Ne,
cda0: 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
cdb0: 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  (12), 0},.      
cdc0: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
cdd0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 74   0, 0,        "t
cde0: 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20 20 20  rigger"},.      
cdf0: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
ce00: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
ce10: 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  , /* sqlite_mast
ce20: 65 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20 20 20  er.type */.     
ce30: 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
ce40: 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20 30    0, ADDR(12), 0
ce50: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
ce60: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
ce70: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
ce80: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
ce90: 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30    0, ADDR(13), 0
cea0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
ceb0: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
cec0: 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(3),  0},.     
ced0: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
cee0: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
cef0: 7d 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20  }, /* 12 */.    
cf00: 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  };.    Index *pI
cf10: 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20  dx;.    Trigger 
cf20: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73  *pTrigger;.    s
cf30: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
cf40: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
cf50: 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  , 0, pTab->iDb);
cf60: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
cf70: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
cf80: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
cf90: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
cfa0: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
cfb0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
cfc0: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
cfd0: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
cfe0: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
cff0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
d000: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
d010: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
d020: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
d030: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
d040: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
d050: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
d060: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e  ger->iDb==pTab->
d070: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
d080: 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20  >iDb==1 );.     
d090: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
d0a0: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
d0b0: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
d0c0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65     if( pParse->e
d0d0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
d0e0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
d0f0: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
d100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d110: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
d120: 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  ab->pTrigger;.  
d130: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d140: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
d150: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
d160: 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
d170: 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
d180: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c   the.    ** tabl
d190: 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
d1a0: 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
d1b0: 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
d1c0: 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
d1d0: 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20     ** every row 
d1e0: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
d1f0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
d200: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
d210: 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  ne being.    ** 
d220: 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
d230: 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
d240: 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  perately because
d250: 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
d260: 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
d270: 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
d280: 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
d290: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
d2a0: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  another.    ** d
d2b0: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
d2c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
d2d0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54  asterTable(v, pT
d2e0: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61  ab->iDb);.    ba
d2f0: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
d300: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
d310: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
d320: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
d330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
d340: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
d350: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
d360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
d370: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
d380: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
d390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d3a0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d3b0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  0, 0);.    if( !
d3c0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
d3d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d3e0: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
d3f0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pTab->tnum, pTab
d400: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  ->iDb);.      fo
d410: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
d420: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
d430: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
d440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d450: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
d460: 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  troy, pIdx->tnum
d470: 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20  , pIdx->iDb);.  
d480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d490: 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
d4a0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
d4b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
d4c0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
d4d0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
d4e0: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  the table..  **.
d4f0: 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
d500: 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  if the SQL state
d510: 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20  ment began with 
d520: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
d530: 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e  ord,.  ** then n
d540: 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64  o changes should
d550: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
d560: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
d570: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  plain ){.    sql
d580: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
d590: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
d5a0: 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
d5b0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
d5c0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20  nChanges;.  }.  
d5d0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
d5e0: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
d5f0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
d600: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
d610: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
d620: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d630: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d640: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
d650: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
d660: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
d670: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
d680: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
d690: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
d6a0: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
d6b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
d6c0: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
d6d0: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
d6e0: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
d6f0: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
d700: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
d710: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
d720: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
d730: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
d740: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
d750: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
d760: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
d770: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
d780: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
d790: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
d7a0: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
d7b0: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
d7c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
d7d0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
d7e0: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
d7f0: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
d800: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
d810: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
d820: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
d830: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
d840: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
d850: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
d860: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
d870: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
d880: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
d890: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
d8a0: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
d8b0: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
d8c0: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
d8d0: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
d8e0: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
d8f0: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
d900: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
d910: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
d920: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
d930: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
d940: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
d950: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
d960: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
d970: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
d980: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
d990: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
d9a0: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
d9b0: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
d9c0: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
d9d0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
d9e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d9f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
da00: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
da10: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
da20: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
da30: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
da40: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
da50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
da60: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
da70: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
da80: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
da90: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
daa0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
dab0: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
dac0: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
dad0: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
dae0: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  hms. */.){.  Tab
daf0: 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
db00: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
db10: 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
db20: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
db30: 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a  har *z;.  FKey *
db40: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73  pFKey = 0;..  as
db50: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
db60: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
db70: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
db80: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
db90: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
dba0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
dbb0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
dbc0: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
dbd0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
dbe0: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
dbf0: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
dc00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
dc10: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
dc20: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
dc30: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
dc40: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
dc50: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
dc60: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
dc70: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
dc80: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
dc90: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
dca0: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
dcb0: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
dcc0: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
dcd0: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
dce0: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
dcf0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
dd00: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
dd10: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
dd20: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
dd30: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
dd40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
dd50: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
dd60: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
dd70: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
dd80: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
dd90: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
dda0: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
ddb0: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
ddc0: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
ddd0: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
dde0: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
ddf0: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
de00: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
de10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
de20: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
de30: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
de40: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
de50: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
de60: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
de70: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
de80: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
de90: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
dea0: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
deb0: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
dec0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
ded0: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
dee0: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
def0: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
df00: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
df10: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
df20: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
df30: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
df40: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
df50: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
df60: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
df70: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
df80: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
df90: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
dfa0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
dfb0: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
dfc0: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
dfd0: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
dfe0: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
dff0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
e000: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
e010: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
e020: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
e030: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
e040: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
e050: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
e060: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
e070: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
e080: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
e090: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
e0a0: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
e0c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e0d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
e0e0: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
e0f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e100: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
e110: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
e120: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
e130: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
e140: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
e150: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
e160: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
e170: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
e180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e190: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
e1a0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
e1b0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
e1c0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
e1d0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
e1e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
e1f0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
e200: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
e210: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
e220: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
e230: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
e240: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
e250: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
e260: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
e270: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
e280: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
e290: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
e2a0: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
e2b0: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
e2c0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
e2d0: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
e2e0: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
e2f0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
e300: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
e310: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
e320: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
e330: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
e340: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
e350: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
e360: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73  Free(pFKey);.  s
e370: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
e380: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
e390: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
e3a0: 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b  tDelete(pToCol);
e3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
e3c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e3d0: 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
e3e0: 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
e3f0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
e400: 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
e410: 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
e420: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
e430: 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
e440: 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
e450: 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
e460: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
e470: 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
e480: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
e490: 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
e4a0: 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
e4b0: 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
e4c0: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
e4d0: 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
e4e0: 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
e4f0: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
e500: 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
e510: 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
e520: 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  red){.  Table *p
e530: 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
e540: 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
e550: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
e560: 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
e570: 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
e580: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e590: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
e5a0: 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a  d = isDeferred;.
e5b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
e5c0: 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
e5d0: 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
e5e0: 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d  Index is the nam
e5f0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
e600: 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73  ** and pTable is
e610: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
e620: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
e630: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
e640: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
e650: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
e660: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
e670: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
e680: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
e690: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
e6a0: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
e6b0: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
e6c0: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
e6d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
e6e0: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
e6f0: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
e700: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
e710: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
e720: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
e730: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
e740: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
e750: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
e760: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
e770: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
e780: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
e790: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
e7a0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
e7b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
e7c0: 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
e7d0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
e7e0: 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
e7f0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
e800: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
e810: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
e820: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
e830: 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
e840: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e850: 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
e860: 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
e870: 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
e880: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
e890: 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
e8a0: 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
e8b0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
e8c0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
e8d0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
e8e0: 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
e8f0: 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
e900: 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20   *pTblName,  /* 
e910: 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
e920: 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
e930: 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
e940: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
e950: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
e960: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
e970: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
e980: 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f  nError,     /* O
e990: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
e9a0: 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
e9b0: 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
e9c0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
e9d0: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
e9e0: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
e9f0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ea00: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
ea10: 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
ea20: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
ea30: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
ea40: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
ea50: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
ea60: 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61  *pTab = 0; /* Ta
ea70: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
ea80: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
ea90: 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65  ndex = 0; /* The
eaa0: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
eab0: 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
eac0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
ead0: 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
eae0: 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b  ullId;    /* Fak
eaf0: 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
eb00: 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
eb10: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
eb20: 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
eb30: 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
eb40: 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
eb50: 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20    int isTemp;   
eb60: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
eb70: 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78   temporary index
eb80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
eb90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
eba0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
ebb0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
ebc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
ebd0: 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
ebe0: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
ebf0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
ec00: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
ec10: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
ec20: 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  eate */..  if( p
ec30: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
ec40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
ec50: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
ec60: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
ec70: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
ec80: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
ec90: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
eca0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
ecb0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
ecc0: 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
ecd0: 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
ece0: 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
ecf0: 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
ed00: 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
ed10: 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
ed20: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
ed30: 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
ed40: 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
ed50: 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
ed60: 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
ed70: 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
ed80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
ed90: 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
eda0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
edb0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
edc0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
edd0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
ede0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
edf0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
ee00: 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ndex;..    /* If
ee10: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
ee20: 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
ee30: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
ee40: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
ee50: 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
ee60: 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
ee70: 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20  atabase to 1..  
ee80: 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20    */.    pTab = 
ee90: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
eea0: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
eeb0: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
eec0: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
eed0: 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
eee0: 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29  & pTab->iDb==1 )
eef0: 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b  {.      iDb = 1;
ef00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
ef10: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
ef20: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
ef30: 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
ef40: 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
ef50: 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
ef60: 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
ef70: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
ef80: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
ef90: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
efa0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
efb0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
efc0: 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
efd0: 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
efe0: 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
eff0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
f000: 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
f010: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
f020: 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
f030: 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
f040: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
f050: 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
f060: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
f070: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
f080: 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62  ;.    iDb = pTab
f090: 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66  ->iDb;.  }..  if
f0a0: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
f0b0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
f0c0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
f0d0: 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
f0e0: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
f0f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f100: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
f110: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
f120: 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
f130: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
f140: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f150: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
f160: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
f170: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f180: 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
f190: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
f1a0: 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
f1b0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f1c0: 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20  .  }.  isTemp = 
f1d0: 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
f1e0: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
f1f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
f200: 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
f210: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
f220: 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
f230: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
f240: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
f250: 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
f260: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
f270: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
f280: 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
f290: 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
f2a0: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
f2b0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f2c0: 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
f2d0: 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
f2e0: 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
f2f0: 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
f300: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
f310: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
f320: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
f330: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
f340: 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
f350: 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
f360: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
f370: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
f380: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
f390: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
f3a0: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
f3b0: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
f3c0: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
f3d0: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
f3e0: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
f3f0: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
f400: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
f410: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
f420: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
f430: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
f440: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
f450: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
f460: 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
f470: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f480: 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
f490: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
f4a0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f4b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f4c0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
f4d0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
f4e0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
f4f0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
f500: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
f510: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
f520: 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e  busy ){.      In
f530: 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
f540: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
f550: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
f560: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
f570: 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
f580: 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
f590: 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
f5a0: 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
f5b0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
f5c0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
f5d0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
f5e0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
f5f0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
f600: 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
f610: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
f620: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  ex(db, zName, db
f630: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
f640: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
f650: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f660: 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
f670: 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
f680: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
f690: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f6a0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f6b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
f6c0: 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
f6d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
f6e0: 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
f6f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f700: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f710: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
f720: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
f730: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
f740: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
f750: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f770: 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d  else if( pName==
f780: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
f790: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
f7a0: 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
f7b0: 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
f7c0: 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
f7d0: 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
f7e0: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
f7f0: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
f800: 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e  ntf(zBuf,"_%d",n
f810: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
f820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
f830: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
f840: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
f850: 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  _", pTab->zName,
f860: 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
f870: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
f880: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
f890: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
f8a0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
f8b0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
f8c0: 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
f8d0: 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
f8e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
f8f0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
f900: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
f910: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
f920: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
f930: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f940: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f950: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
f960: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
f970: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
f980: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
f990: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
f9a0: 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
f9b0: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
f9c0: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
f9d0: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
f9e0: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
f9f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
fa00: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
fa10: 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
fa20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
fa30: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
fa40: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
fa50: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
fa60: 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
fa70: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
fa80: 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
fa90: 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
faa0: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
fab0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
fac0: 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
fad0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
fae0: 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
faf0: 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
fb00: 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
fb10: 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
fb20: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
fb30: 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
fb40: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
fb50: 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
fb60: 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
fb70: 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
fb80: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
fb90: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
fba0: 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
fbb0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
fbc0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
fbd0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
fbe0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
fbf0: 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
fc00: 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
fc10: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
fc20: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
fc30: 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
fc40: 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74       (sizeof(int
fc70: 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) + sizeof(CollS
fc80: 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
fc90: 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  pr );.  if( pInd
fca0: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
fcb0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
fcc0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
fcd0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
fce0: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
fcf0: 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  l[pList->nExpr];
fd00: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
fd10: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
fd20: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
fd30: 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72  t->nExpr];.  str
fd40: 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
fd50: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
fd60: 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
fd70: 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
fd80: 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
fd90: 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
fda0: 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
fdb0: 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
fdc0: 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
fdd0: 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62  0;.  pIndex->iDb
fde0: 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63   = iDb;..  /* Sc
fdf0: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
fe00: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
fe10: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
fe20: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
fe30: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
fe40: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
fe50: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
fe60: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
fe70: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
fe80: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
fe90: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
fea0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
feb0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  pr; i++){.    fo
fec0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
fed0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
fee0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fef0: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
ff00: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
ff10: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
ff20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ff30: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
ff40: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
ff50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ff60: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
ff70: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
ff80: 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
ff90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
ffa0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
ffb0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
ffc0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
ffd0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
ffe0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
fff0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
10000 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
10010 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
10020 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
10030 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
10040 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
10050 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
10060 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
10070 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
10080 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
10090 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
100a0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
100b0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
100c0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
100d0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
100e0 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
100f0 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
10100 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
10110 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
10120 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
10130 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
10140 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
10150 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
10170 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
10180 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
10190 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  xpr;..  if( pTab
101a0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
101b0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
101c0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
101d0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
101e0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
101f0 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
10200 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
10210 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
10220 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
10230 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
10240 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
10250 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
10260 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
10270 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
10280 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
10290 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
102a0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
102b0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
102c0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
102d0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
102e0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
102f0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
10300 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
10310 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
10320 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
10330 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
10340 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
10350 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
10360 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
10370 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
10380 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
10390 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
103a0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
103b0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
103c0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
103d0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
103e0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
103f0 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
10400 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
10410 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
10420 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10430 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
10440 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
10450 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
10460 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
10470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
10480 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
10490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
104a0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
104b0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
104c0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
104d0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
104e0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
104f0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
10500 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
10510 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
10520 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
10530 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
10540 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
10550 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
10560 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
10570 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
10580 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
10590 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
105a0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
105b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
105c0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
105d0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
105e0 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
105f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
10600 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
10610 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
10620 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
10630 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
10640 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
10650 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
10660 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
10670 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
10680 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
10690 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
106a0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
106b0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
106c0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
106d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
106e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
106f0 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
10700 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
10710 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
10720 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
10730 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
10740 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
10750 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
10760 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
10770 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
10780 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
10790 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
107a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
107b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
107c0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
107d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
107e0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
107f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10800 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10820 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
10830 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
10840 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
10850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10860 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
10870 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
10880 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
10890 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
108a0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
108b0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
108c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
108d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
108e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
108f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10900 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
10910 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
10920 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
10930 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
10940 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
10950 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
10960 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  s. .  */.  if( !
10970 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10980 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
10990 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
109a0 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
109b0 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
109c0 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  .idxHash, .     
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
109f0 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78  e, strlen(pIndex
10a00 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  ->zName)+1, pInd
10a10 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
10a20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10a30 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
10a40 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
10a50 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
10a60 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
10a70 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
10a80 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
10a90 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
10aa0 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
10ab0 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
10ac0 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
10ad0 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
10ae0 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
10af0 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
10b00 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
10b10 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
10b20 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
10b30 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
10b40 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
10b50 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72   table number fr
10b60 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
10b70 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20  newTnum field.. 
10b80 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
10b90 69 74 2e 62 75 73 79 20 26 26 20 70 54 62 6c 4e  it.busy && pTblN
10ba0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49  ame!=0 ){.    pI
10bb0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
10bc0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
10bd0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
10be0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
10bf0 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
10c00 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
10c10 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
10c20 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
10c30 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
10c40 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
10c50 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
10c60 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
10c70 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
10c80 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
10c90 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
10ca0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
10cb0 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
10cc0 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
10cd0 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
10ce0 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
10cf0 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
10d00 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
10d10 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
10d20 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
10d30 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
10d40 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
10d50 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
10d60 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
10d70 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
10d80 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
10d90 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
10da0 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
10db0 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
10dc0 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
10dd0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
10de0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
10df0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
10e00 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
10e10 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
10e20 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
10e30 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
10e40 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
10e50 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
10e60 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
10e70 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
10e80 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
10e90 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
10ea0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
10eb0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
10ec0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
10ed0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
10ee0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
10ef0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e   Vdbe *v;.    in
10f00 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 0a 20  t lbl1, lbl2;.. 
10f10 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
10f20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10f30 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
10f40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10f50 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
10f60 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
10f70 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
10f80 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
10f90 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
10fa0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
10fb0 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69  MasterTable(v, i
10fc0 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Db);.    }.    s
10fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10fe0 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
10ff0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
11000 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
11010 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22  String8, 0, 0, "
11020 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
11030 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
11040 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
11050 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 49 6e 64  ing8, 0, 0, pInd
11060 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
11070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
11080 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
11090 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
110a0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
110b0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
110c0 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c  _CreateIndex, 0,
110d0 20 69 44 62 2c 28 63 68 61 72 2a 29 26 70 49 6e   iDb,(char*)&pIn
110e0 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50 4f 49  dex->tnum,P3_POI
110f0 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65  NTER);.    pInde
11100 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  x->tnum = 0;.   
11110 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
11120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11130 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
11140 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
11150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11160 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11170 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
11180 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
11190 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
111a0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
111b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
111c0 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
111d0 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
111e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
111f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11200 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
11210 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
11220 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
11230 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
11240 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  _None ){.       
11250 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11260 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45  geP3(v, -1, "CRE
11270 41 54 45 20 49 4e 44 45 58 20 22 2c 20 50 33 5f  ATE INDEX ", P3_
11280 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
11290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
112a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
112b0 33 28 76 2c 20 2d 31 2c 20 22 43 52 45 41 54 45  3(v, -1, "CREATE
112c0 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 22 2c   UNIQUE INDEX ",
112d0 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
112e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
112f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11300 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
11310 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72  ;.      n = Addr
11320 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
11330 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 3b 0a  (pName->z) + 1;.
11340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11350 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
11360 20 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a 20   pName->z, n);. 
11370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11380 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63  AddOp(v, OP_Conc
11390 61 74 38 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  at8, 2, 0);.    
113a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
113b0 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
113c0 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74  ecord, 5, 0, "tt
113d0 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29  tit", P3_STATIC)
113e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
113f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
11400 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
11410 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
11420 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11430 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11440 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
11450 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
11460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11470 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32  , OP_OpenRead, 2
11480 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
11490 20 20 20 20 20 2f 2a 20 56 64 62 65 43 6f 6d 6d       /* VdbeComm
114a0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54  ent((v, "%s", pT
114b0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a 2f 0a  ab->zName)); */.
114c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
114e0 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c 20 70  NumColumns, 2, p
114f0 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20  Tab->nCol);.    
11500 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 33    lbl2 = sqlite3
11510 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11530 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
11540 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b  ewind, 2, lbl2);
11550 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
11560 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11570 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
11580 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
11590 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
115a0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
115b0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
115c0 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
115d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
115e0 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  None,.          
115f0 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64              "ind
11600 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
11610 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
11620 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
11630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11640 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
11650 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
11660 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11670 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20  abel(v, lbl2);. 
11680 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11690 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
116a0 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 2, 0);.      
116b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
116c0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
116d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
116e0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
116f0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  {.      if( !isT
11700 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
11710 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
11720 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
11730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11750 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
11760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11770 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
11780 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  n(pParse);.    }
11790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
117a0 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
117b0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
117c0 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
117d0 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
117e0 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
117f0 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
11800 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
11810 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
11820 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
11830 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
11840 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
11850 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
11860 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
11870 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
11880 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
11890 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
118a0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
118b0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
118c0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
118d0 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65  lace){.    pInde
118e0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
118f0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61  >pIndex;.    pTa
11900 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
11910 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
11920 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
11930 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
11940 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
11950 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
11960 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
11970 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
11980 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
11990 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
119a0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
119b0 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
119c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68  >pNext;.    pOth
119d0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
119e0 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
119f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61   = 0;..  /* Clea
11a00 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
11a10 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
11a20 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
11a30 70 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65 46  pIndex ) sqliteF
11a40 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 73  ree(pIndex);.  s
11a50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11a60 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
11a70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
11a80 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
11a90 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
11aa0 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
11ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11ac0 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
11ad0 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
11ae0 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
11af0 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
11b00 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
11b10 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
11b20 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
11b30 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
11b40 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
11b50 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
11b60 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
11b70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
11b80 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
11b90 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
11ba0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
11bb0 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
11bc0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  rn;.  assert( pN
11bd0 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
11be0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
11bf0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
11c00 6d 61 28 70 50 61 72 73 65 29 20 29 20 72 65 74  ma(pParse) ) ret
11c10 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  urn;.  pIndex = 
11c20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
11c30 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
11c40 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
11c50 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
11c60 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
11c70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11c80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11c90 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
11ca0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
11cb0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
11cc0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
11cd0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
11ce0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
11cf0 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
11d00 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
11d10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11d20 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
11d30 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
11d40 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
11d50 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
11d60 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
11d70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
11d80 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
11d90 65 78 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66 28  ex;.  }./*.  if(
11da0 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29   pIndex->iDb>1 )
11db0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11dc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
11dd0 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63 68 65  annot alter sche
11de0 6d 61 20 6f 66 20 61 74 74 61 63 68 65 64 20 22  ma of attached "
11df0 0a 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73  .       "databas
11e00 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  es", 0);.    got
11e10 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
11e20 78 3b 0a 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64 65  x;.  }.*/.#ifnde
11e30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11e40 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
11e50 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
11e60 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
11e70 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
11e80 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
11e90 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
11ea0 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
11eb0 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a  b[pIndex->iDb].z
11ec0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
11ed0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
11ee0 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78  EMA_TABLE(pIndex
11ef0 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  ->iDb);.    if( 
11f00 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
11f10 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
11f20 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
11f30 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
11f40 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
11f50 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
11f60 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29  f( pIndex->iDb )
11f70 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
11f80 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
11f90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
11fa0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11fb0 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
11fc0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
11fd0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
11fe0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
11ff0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
12000 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
12010 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
12020 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
12030 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
12040 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
12050 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12060 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
12070 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
12080 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
12090 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  Index[] = {.    
120a0 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
120b0 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
120c0 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  }, .      { OP_S
120d0 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 30  tring8,     0, 0
120e0 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31  ,       0}, /* 1
120f0 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
12100 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
12110 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
12120 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20   { OP_MemLoad,  
12130 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    1, 0,       0}
12140 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
12150 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
12160 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   0, 1,       0},
12170 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20  .      { OP_Eq, 
12180 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
12190 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  8), 0},.      { 
121a0 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
121b0 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20  , ADDR(3), 0},. 
121c0 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20       { OP_Goto, 
121d0 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29        0, ADDR(9)
121e0 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
121f0 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
12200 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
12210 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  8 */.    };.    
12220 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73  int base;..    s
12230 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
12240 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
12250 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  , 0, pIndex->iDb
12260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  );.    sqlite3Op
12270 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
12280 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
12290 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
122a0 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
122b0 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
122c0 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65  Index), dropInde
122d0 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  x);.    sqlite3V
122e0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
122f0 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+1, pIndex->z
12300 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
12310 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 21 3d 31  ( pIndex->iDb!=1
12320 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12330 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
12340 2c 20 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  , v, pIndex->iDb
12350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
12360 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12370 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
12380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12390 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
123a0 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  troy, pIndex->tn
123b0 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  um, pIndex->iDb)
123c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
123d0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
123e0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
123f0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
12400 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
12410 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  on of this index
12420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
12430 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
12440 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 6c 69  .    sqlite3Unli
12450 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
12460 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
12470 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12480 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
12490 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ges;.  }..exit_d
124a0 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
124b0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
124c0 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
124d0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
124e0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
124f0 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
12500 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
12510 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
12520 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
12530 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
12540 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
12550 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
12560 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
12570 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73  ListAppend(IdLis
12580 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
12590 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
125a0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
125b0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
125c0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c  lloc( sizeof(IdL
125d0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
125e0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
125f0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
12600 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a  nAlloc = 0;.  }.
12610 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64    if( pList->nId
12620 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
12630 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
12640 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
12650 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
12660 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
12670 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 5;.    a = s
12680 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
12690 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41  st->a, pList->nA
126a0 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73  lloc*sizeof(pLis
126b0 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
126c0 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
126d0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
126e0 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
126f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12700 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
12710 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   = a;.  }.  mems
12720 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
12730 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a  st->nId], 0, siz
12740 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
12750 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c  );.  pList->a[pL
12760 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20  ist->nId].zName 
12770 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
12780 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
12790 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a    pList->nId++;.
127a0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
127b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
127c0 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
127d0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
127e0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
127f0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
12800 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
12810 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
12820 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
12830 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
12840 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
12850 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   A new SrcList i
12860 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
12870 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
12880 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fails..**.** If 
12890 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
128a0 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
128b0 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
128c0 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
128d0 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
128e0 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
128f0 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
12900 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
12910 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
12920 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
12930 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
12940 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
12950 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
12960 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
12970 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
12980 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
12990 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
129a0 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
129b0 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
129c0 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
129d0 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
129e0 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
129f0 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
12a00 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
12a10 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
12a20 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
12a30 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
12a40 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
12a50 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
12a60 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12a70 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
12a80 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
12a90 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
12aa0 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a  Append(A,B,0);.*
12ab0 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
12ac0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
12ad0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
12ae0 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
12af0 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
12b00 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
12b10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12b20 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
12b30 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
12b40 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
12b50 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
12b60 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
12b70 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
12b80 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
12b90 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
12ba0 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c  , Token *pTable,
12bb0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
12bc0 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  e){.  struct Src
12bd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
12be0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
12bf0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
12c00 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
12c10 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
12c20 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
12c30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12c40 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
12c50 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
12c60 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73  List->nSrc>=pLis
12c70 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
12c80 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
12c90 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
12ca0 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77  c *= 2;.    pNew
12cb0 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
12cc0 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  (pList,.        
12cd0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
12ce0 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e  List) + (pList->
12cf0 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
12d00 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
12d10 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
12d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12d30 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
12d40 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
12d50 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
12d60 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
12d70 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
12d80 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
12d90 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  rc];.  memset(pI
12da0 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  tem, 0, sizeof(p
12db0 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
12dc0 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
12dd0 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
12de0 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
12df0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
12e00 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
12e10 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
12e20 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
12e30 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
12e40 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
12e50 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
12e60 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
12e70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
12e80 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
12e90 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
12ea0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
12eb0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
12ec0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74  Database);.  pIt
12ed0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31  em->iCursor = -1
12ee0 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b  ;.  pList->nSrc+
12ef0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
12f00 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
12f10 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  gn cursors to al
12f20 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
12f30 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
12f40 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
12f50 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
12f60 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
12f70 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
12f80 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
12f90 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
12fa0 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
12fb0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30  ->a[i].iCursor<0
12fc0 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
12fd0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
12fe0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
12ff0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13000 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
13010 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
13020 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
13030 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
13040 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
13050 69 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c  ite3SrcListAddAl
13060 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ias(SrcList *pLi
13070 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
13080 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  n){.  if( pList 
13090 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30  && pList->nSrc>0
130a0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   ){.    pList->a
130b0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e  [pList->nSrc-1].
130c0 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
130d0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
130e0 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  oken);.  }.}../*
130f0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
13100 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
13110 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
13120 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
13130 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
13140 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13150 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
13160 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
13170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
13180 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
13190 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
131a0 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
131b0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
131c0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
131d0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
131e0 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
131f0 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
13200 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
13210 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
13220 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13230 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
13240 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
13250 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
13260 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
13270 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
13280 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
13290 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
132a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
132b0 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
132c0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
132d0 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
132e0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
132f0 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   -1;.}../*.** De
13300 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
13310 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
13320 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
13330 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
13340 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
13350 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
13360 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
13370 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
13380 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
13390 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
133a0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
133b0 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
133c0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
133d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
133e0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
133f0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
13400 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
13410 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  as);.    if( pLi
13420 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26  st->a[i].pTab &&
13430 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
13440 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
13450 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
13460 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c  eleteTable(0, pL
13470 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b  ist->a[i].pTab);
13480 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13490 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
134a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
134b0 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
134c0 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74  ExprDelete(pList
134d0 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20  ->a[i].pOn);.   
134e0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
134f0 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
13500 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  .pUsing);.  }.  
13510 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
13520 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  );.}../*.** Begi
13530 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
13540 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
13550 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
13560 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
13570 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
13580 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
13590 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
135a0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
135b0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
135c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
135d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
135e0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
135f0 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
13600 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
13610 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13620 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
13630 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
13640 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
13650 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
13660 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13670 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
13680 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
13690 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
136a0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
136b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
136c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
136d0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
136e0 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
136f0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
13700 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
13710 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
13720 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
13730 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
13740 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
13750 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
13760 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
13770 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
13780 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
13790 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
137a0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
137b0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
137c0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
137d0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
137e0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
137f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13800 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
13810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13820 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
13830 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
13840 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
13850 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
13860 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
13870 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
13880 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
13890 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
138a0 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
138b0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
138c0 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
138d0 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
138e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
138f0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13900 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
13910 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
13920 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
13930 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13940 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
13950 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
13960 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
13970 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
13980 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13990 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
139a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
139b0 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
139c0 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
139d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
139e0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
139f0 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
13a00 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
13a10 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
13a20 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
13a30 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
13a40 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
13a50 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
13a60 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
13a70 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
13a80 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
13a90 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
13aa0 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
13ab0 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
13ac0 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
13ad0 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
13ae0 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
13af0 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
13b00 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
13b10 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
13b20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
13b30 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
13b40 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
13b50 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
13b60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13b70 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
13b80 4f 50 5f 47 6f 73 75 62 20 74 68 61 74 0a 2a 2a  OP_Gosub that.**
13b90 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
13ba0 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
13bb0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
13bc0 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
13bd0 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
13be0 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
13bf0 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
13c00 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
13c10 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
13c20 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
13c30 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
13c40 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
13c50 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
13c60 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
13c70 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
13c80 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
13c90 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
13ca0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
13cb0 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
13cc0 64 20 74 68 65 20 4f 50 5f 47 6f 73 75 62 20 50  d the OP_Gosub P
13cd0 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
13ce0 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
13cf0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
13d00 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
13d10 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
13d20 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
13d30 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
13d40 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
13d50 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
13d60 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g()..*/.void sql
13d70 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
13d80 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
13d90 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
13da0 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
13db0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
13dc0 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
13dd0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13de0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
13df0 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
13e00 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
13e10 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
13e20 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
13e30 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
13e40 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
13e50 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
13e60 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
13e70 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
13e80 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
13e90 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a  sert( iDb<32 );.
13ea0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
13eb0 6f 6b 69 65 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20  okieMask==0 ){. 
13ec0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
13ed0 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  eGoto = sqlite3V
13ee0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
13ef0 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  oto, 0, 0);.  }.
13f00 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
13f10 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
13f20 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73  cookieMask & mas
13f30 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  k)==0 ){.    pPa
13f40 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
13f50 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 70 50 61  |= mask;.    pPa
13f60 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
13f70 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
13f80 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
13f90 69 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ie;.  }.}../*.**
13fa0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
13fb0 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
13fc0 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
13fd0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
13fe0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
13ff0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
14000 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
14010 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
14020 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
14030 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
14040 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
14050 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
14060 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
14070 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
14080 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
14090 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
140a0 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
140b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
140c0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
140d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
140e0 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
140f0 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
14100 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
14110 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
14120 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
14130 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
14140 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
14150 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
14160 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
14170 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
14180 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
14190 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
141a0 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
141b0 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
141c0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
141d0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
141e0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
141f0 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
14200 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
14210 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
14220 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
14230 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
14240 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
14250 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
14260 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
14270 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
14280 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
14290 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
142a0 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
142b0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
142c0 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
142d0 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
142e0 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
142f0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
14300 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
14310 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
14320 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
14330 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
14340 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
14350 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
14360 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
14370 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
14380 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
14390 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
143a0 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
143b0 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
143c0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
143d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
143e0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
143f0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
14400 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
14410 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
14420 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
14430 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
14440 73 65 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  setStatement ){.
14450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14460 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
14470 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
14480 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20   }.  if( iDb!=1 
14490 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
144a0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
144b0 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
144c0 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
144d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
144e0 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63  e code that conc
144f0 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69  ludes an operati
14500 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  on that may have
14510 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20   changed.** the 
14520 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20  database.  If a 
14530 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14540 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
14550 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20  d, then emit.** 
14560 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61  an OP_Commit tha
14570 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  t will cause the
14580 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63   changes to be c
14590 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
145a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
145b0 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72  t checkpoints ar
145c0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
145d0 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65  committed at the
145e0 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61   end of.** a sta
145f0 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c  tement.  Note al
14600 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 63 61  so that there ca
14610 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61  n be multiple ca
14620 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
14630 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
14640 61 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72  ation() but ther
14650 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
14660 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c   a single.** cal
14670 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57  l to sqlite3EndW
14680 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20  riteOperation() 
14690 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
146a0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
146b0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
146c0 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
146d0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
146e0 73 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65 74 65  se){.  /* Delete
146f0 20 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75 72 6e   me! */.  return
14700 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  ;.}../* .** Retu
14710 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  rn the transient
14720 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
14730 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65  bject used for e
14740 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69  ncoding conversi
14750 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51  ons.** during SQ
14760 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a  L compilation..*
14770 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
14780 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73  *sqlite3GetTrans
14790 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65  ientValue(sqlite
147a0 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62   *db){.  if( !db
147b0 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ->pValue ){.    
147c0 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c  db->pValue = sql
147d0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
147e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
147f0 3e 70 56 61 6c 75 65 3b 0a 7d 0a                 >pValue;.}.