/ Hex Artifact Content
Login

Artifact 154e7a666a7b36da04c739a6af87d5e9bdcd0cda:


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 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 32 37 31 20 32 30 30 34 2f 31 31 2f 30 35  1.271 2004/11/05
02f0: 20 32 33 3a 34 36 3a 31 35 20 64 72 68 20 45 78   23:46:15 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20  rsed.  Check to 
0390: 73 65 65 20 69 66 20 74 68 65 20 73 63 68 65 6d  see if the schem
03a0: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
03b0: 73 65 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  se needs.** to b
03c0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
03d0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e  SQLITE_MASTER an
03e0: 64 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41  d SQLITE_TEMP_MA
03f0: 53 54 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20  STER tables..** 
0400: 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
0410: 20 72 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69   read it..*/.voi
0420: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
0430: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
0440: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
0450: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0460: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0470: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0480: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
04a0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
04b0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
04c0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04d0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
04e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
04f0: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
0500: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0510: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
0520: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
0530: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
0540: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
0550: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0560: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0570: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0580: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0590: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
05a0: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
05b0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
05c0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
05d0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
05e0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
05f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0600: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
0610: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0620: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
0630: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
0640: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
0650: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0660: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0670: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a  sted ) return;..
0680: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
0690: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
06a0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
06b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
06c0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
06d0: 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  am.  */.  db = p
06e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
06f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0700: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
0710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
0720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48  dbeAddOp(v, OP_H
0730: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  alt, 0, 0);..   
0740: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
0750: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
0760: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
0770: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
0780: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
0790: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
07a0: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
07b0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
07c0: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
07d0: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
07e0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
07f0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
0800: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
0810: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0820: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
0830: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
0840: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
0850: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
0860: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0870: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
0880: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
0890: 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20  ieGoto>0 ){.    
08a0: 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
08b0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
08c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
08d0: 67 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e  geP2(v, pParse->
08e0: 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71  cookieGoto-1, sq
08f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
0900: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
0910: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
0920: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
0930: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
0940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
0950: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
0960: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
0970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
0980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0990: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
09a0: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
09b0: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
09c0: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
09d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
09e0: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
09f0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
0a00: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
0a10: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iDb]);.      }. 
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
0a40: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
0a50: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
0a60: 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f  .    /* Add a No
0a70: 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  -op that contain
0a80: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  s the complete t
0a90: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69  ext of the compi
0aa0: 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73  led SQL.    ** s
0ab0: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20  tatement as its 
0ac0: 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  P3 argument.  Th
0ad0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  is does not chan
0ae0: 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  ge the functiona
0af0: 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74  lity.    ** of t
0b00: 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20  he program. .   
0b10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
0b20: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
0b30: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  ment sqlite3_tra
0b40: 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c 69  ce() functionali
0b50: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ty..    */.    s
0b60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
0b70: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
0b80: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50  pParse->zSql, pP
0b90: 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72  arse->zTail-pPar
0ba0: 73 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a  se->zSql);.  }..
0bb0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44  .  /* Get the VD
0bc0: 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79  BE program ready
0bd0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20   for execution. 
0be0: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70   */.  if( v && p
0bf0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
0c00: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  {.    FILE *trac
0c10: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
0c20: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
0c30: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
0c40: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   0;.    sqlite3V
0c50: 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63  dbeTrace(v, trac
0c60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
0c70: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
0c80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
0c90: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20  arse->nMem+3,.  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
0cc0: 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65  Tab+3, pParse->e
0cd0: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
0ce0: 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65  rse->rc = pParse
0cf0: 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f  ->nErr ? SQLITE_
0d00: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
0d10: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
0d20: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
0d30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
0d40: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
0d50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
0d60: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
0d70: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
0d80: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
0d90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
0da0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
0db0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0dc0: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
0dd0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
0de0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
0df0: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  sk = 0;.  pParse
0e00: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30  ->cookieGoto = 0
0e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74  ;.}../*.** Run t
0e20: 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f  he parser and co
0e30: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63  de generator rec
0e40: 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65  ursively in orde
0e50: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a  r to generate.**
0e60: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51   code for the SQ
0e70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  L statement give
0e80: 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  n onto the end o
0e90: 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e  f the pParse con
0ea0: 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  text.** currentl
0eb0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
0ec0: 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20  tion.  When the 
0ed0: 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65  parser is run re
0ee0: 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69  cursively.** thi
0ef0: 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c  s way, the final
0f00: 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20   OP_Halt is not 
0f10: 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68  appended and oth
0f20: 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  er initializatio
0f30: 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a  n.** and finaliz
0f40: 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20  ation steps are 
0f50: 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20  omitted because 
0f60: 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69  those are handli
0f70: 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74  ng by the.** out
0f80: 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a  ermost parser..*
0f90: 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68  *.** Not everyth
0fa0: 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e  ing is nestable.
0fb0: 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20    This facility 
0fc0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
0fd0: 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c  ermit.** INSERT,
0fe0: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
0ff0: 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ETE operations a
1000: 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41  gainst SQLITE_MA
1010: 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61  STER.  Use.** ca
1020: 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65  re if you decide
1030: 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74   to try to use t
1040: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  his routine for 
1050: 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1060: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
1070: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
10a0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
10b0: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
10c0: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zSql;.  int rc;.
10d0: 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a  # define SAVE_SZ
10e0: 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29    (sizeof(Parse)
10f0: 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73   - offsetof(Pars
1100: 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20  e,nVar)).  char 
1110: 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d  saveBuf[SAVE_SZ]
1120: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
1130: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1140: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1150: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
1160: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
1170: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
1180: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
1190: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
11a0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
11b0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
11c0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
11d0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70 50  va_end(ap);.  pP
11e0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
11f0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1200: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1210: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1220: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1230: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1240: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
1250: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1260: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
1270: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
1280: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
1290: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
12a0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
12b0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
12c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
12d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
12e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
12f0: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1300: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1310: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1320: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1330: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1340: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1350: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1360: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1370: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1380: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1390: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
13a0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
13b0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
13c0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
13d0: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
13e0: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
13f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1400: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1410: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1420: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1430: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1440: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1450: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1460: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
1470: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
1480: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
1490: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
14a0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
14b0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14c0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
14d0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
14e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
14f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1500: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1510: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1520: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1530: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1540: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1550: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1560: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
1570: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
1580: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1590: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
15a0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
15b0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
15c0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
15d0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
15e0: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
15f0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
1600: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
1610: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1620: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1630: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1640: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1650: 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .tblHash, zName,
1660: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1670: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1680: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1690: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
16a0: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
16b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
16c0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
16d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
16e0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
16f0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1700: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1710: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1720: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1730: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1740: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1750: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1760: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
1770: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
1780: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
1790: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
17a0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
17b0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
17c0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
17d0: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
17e0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
17f0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
1800: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1810: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
1820: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
1830: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
1840: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
1850: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
1860: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1870: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1880: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1890: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
18a0: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
18b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
18c0: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
18d0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
18e0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
18f0: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
1900: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1910: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
1920: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1930: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1940: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
1950: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
1960: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1970: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
1980: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
1990: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
19a0: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
19b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
19d0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
19e0: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
19f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1a00: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1a10: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1a20: 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
1a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1a40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a50: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
1a60: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
1a70: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
1a80: 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29    zName, zDbase)
1a90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aa0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ab0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1ac0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
1ae0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1af0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
1b00: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1b10: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1b20: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1b30: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1b40: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
1b50: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
1b60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1b70: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
1b80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
1b90: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
1ba0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
1bb0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1bc0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1bd0: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1be0: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1bf0: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1c00: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
1c10: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
1c20: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
1c30: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1c40: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
1c50: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
1c60: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1c70: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1c80: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
1c90: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
1ca0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
1cb0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1cc0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
1cd0: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1ce0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
1cf0: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
1d00: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1d10: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1d20: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
1d30: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
1d40: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28  t i;.  assert( (
1d50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1d60: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
1d70: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
1d80: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1d90: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1da0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
1db0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
1dc0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
1dd0: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
1de0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
1df0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
1e00: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1e10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e20: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1e30: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1e40: 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .idxHash, zName,
1e50: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1e60: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1e70: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1e80: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1e90: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
1ea0: 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  y used by an ind
1eb0: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
1ec0: 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65  d freeIndex(Inde
1ed0: 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 46  x *p){.  sqliteF
1ee0: 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  ree(p->zColAff);
1ef0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
1f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
1f10: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
1f20: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1f30: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
1f40: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1f50: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
1f60: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
1f70: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1f80: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1f90: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
1fa0: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
1fb0: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1fc0: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
1fd0: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
1fe0: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
1ff0: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
2000: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2010: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2020: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
2030: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2040: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  b, Index *p){.  
2050: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20  Index *pOld;..  
2060: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26  assert( db!=0 &&
2070: 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a   p->zName!=0 );.
2080: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
2090: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
20a0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48  aDb[p->iDb].idxH
20b0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20  ash, p->zName,. 
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28           strlen(
20e0: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
20f0: 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26  .  if( pOld!=0 &
2100: 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20  & pOld!=p ){.   
2110: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2120: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
2130: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c  Db].idxHash, pOl
2140: 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  d->zName,.      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2160: 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d  trlen(pOld->zNam
2170: 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d  e)+1, pOld);.  }
2180: 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b  .  freeIndex(p);
2190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
21a0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
21b0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
21c0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
21d0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
21e0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
21f0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
2200: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
2210: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
2220: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2230: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
2240: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
2250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2260: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
2270: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
2280: 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72  en;..  len = str
2290: 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  len(zIdxName);. 
22a0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
22b0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
22c0: 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61 73  >aDb[iDb].idxHas
22d0: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e  h, zIdxName, len
22e0: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  +1, 0);.  if( pI
22f0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2300: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2310: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2320: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2330: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2340: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2360: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2370: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2380: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2390: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
23a0: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
23b0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
23c0: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
23d0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
23e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
23f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2400: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
2410: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
2420: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
2430: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
2440: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2450: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
2460: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2470: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
2480: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
2490: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
24a0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
24b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
24c0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
24d0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
24e0: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
24f0: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
2500: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
2510: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
2520: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
2530: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2540: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
2550: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
2560: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
2570: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
2580: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
2590: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
25a0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
25b0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
25c0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
25d0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
25e0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
25f0: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
2600: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
2610: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
2620: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2630: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
2640: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
2650: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
2660: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
2670: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
2680: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
2690: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
26a0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
26b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
26c0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
26d0: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
26e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
26f0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
2700: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2710: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
2720: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
2730: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
2740: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2750: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
2760: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2770: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
2780: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2790: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
27a0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
27b0: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
27c0: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
27d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
27e0: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
27f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2800: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2820: 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72 69  leteTrigger((Tri
2830: 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73 68  gger*)sqliteHash
2840: 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20  Data(pElem));.  
2850: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2860: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
2870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
2880: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
2890: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
28a0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
28b0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
28c0: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
28d0: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
28e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
28f0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
2900: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
2910: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2920: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
2930: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
2940: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
2950: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2960: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
2970: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
2980: 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61  db, i, DB_Schema
2990: 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28  Loaded);.    if(
29a0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
29b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
29c0: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
29d0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
29e0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
29f0: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
2a00: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
2a10: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2a20: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
2a30: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
2a40: 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20  emove then from 
2a50: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
2a60: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
2a70: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
2a80: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
2a90: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
2aa0: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
2ab0: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
2ac0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
2ad0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2ae0: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
2af0: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
2b00: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
2b10: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
2b20: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2b30: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
2b40: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2b50: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2b60: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
2b70: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
2b80: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75      if( pDb->pAu
2b90: 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41  x && pDb->xFreeA
2ba0: 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41  ux ) pDb->xFreeA
2bb0: 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20  ux(pDb->pAux);. 
2bc0: 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d       pDb->pAux =
2bd0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2be0: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
2bf0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2c00: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
2c10: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
2c20: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
2c30: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2c40: 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65  eFree(pDb->zName
2c50: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
2c60: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
2c70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2c80: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
2c90: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
2ca0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
2cb0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
2cc0: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
2cd0: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
2ce0: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
2cf0: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
2d00: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
2d10: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
2d20: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
2d30: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
2d40: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
2d50: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
2d60: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
2d70: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2d80: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
2d90: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
2da0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
2db0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2dc0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
2dd0: 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ver a rollback o
2de0: 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72 65  ccurs.  If there
2df0: 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20   were.** schema 
2e00: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
2e10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
2e20: 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20  then we have to 
2e30: 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74  reset the.** int
2e40: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
2e50: 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65  s and reload the
2e60: 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a  m from disk..*/.
2e70: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
2e80: 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e  backInternalChan
2e90: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
2ea0: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  {.  if( db->flag
2eb0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
2ec0: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
2ed0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
2ee0: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
2ef0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2f00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2f10: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
2f20: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
2f30: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
2f40: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
2f50: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
2f60: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2f70: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2f80: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nges;.}../*.** C
2f90: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
2fa0: 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62  names from a tab
2fb0: 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73  le or view..*/.s
2fc0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2fd0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
2fe0: 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  s(Table *pTable)
2ff0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
3000: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
3010: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
3020: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
3030: 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20  l=pTable->aCol; 
3040: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
3050: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
3060: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
3070: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  l->zName);.    s
3080: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
3090: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
30a0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  teFree(pCol->zTy
30b0: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
30c0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
30d0: 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  ol);.  pTable->a
30e0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
30f0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
3100: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
3110: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
3120: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
3130: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
3140: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
3150: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
3160: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
3170: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
3180: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
3190: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
31a0: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
31b0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
31c0: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
31d0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
31e0: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
31f0: 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  e.  Nor does it 
3200: 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67  remove.** foreig
3210: 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20  n keys from the 
3220: 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73  sqlite.aFKey has
3230: 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74  h table.  But it
3240: 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a   does destroy.**
3250: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
3260: 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65  es of the indice
3270: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
3280: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3290: 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  th .** the table
32a0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20  ..**.** Indices 
32b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32c0: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e  the table are un
32d0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
32e0: 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72  "db".** data str
32f0: 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55  ucture if db!=NU
3300: 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c  LL.  If db==NULL
3310: 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68  , indices attach
3320: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
3330: 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  le are deleted, 
3340: 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65  but it is assume
3350: 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65  d they have alre
3360: 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69  ady been.** unli
3370: 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nked..*/.void sq
3380: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
3390: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
33a0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
33b0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
33c0: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
33d0: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
33e0: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  ;..  if( pTable=
33f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
3400: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
3410: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
3420: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
3430: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  .  */.  for(pInd
3440: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
3450: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
3460: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
3470: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3480: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
3490: 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  t( pIndex->iDb==
34a0: 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28  pTable->iDb || (
34b0: 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26  pTable->iDb==0 &
34c0: 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31  & pIndex->iDb==1
34d0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  ) );.    sqliteD
34e0: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
34f0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
3500: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72  * Delete all for
3510: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
3520: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
3530: 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a  able.  The keys.
3540: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
3550: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e   already been un
3560: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
3570: 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74  db->aFKey hash t
3580: 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72  able .  */.  for
3590: 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70  (pFKey=pTable->p
35a0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
35b0: 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20  ey=pNextFKey){. 
35c0: 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70     pNextFKey = p
35d0: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b  FKey->pNextFrom;
35e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
35f0: 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62  ble->iDb<db->nDb
3600: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3610: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
3620: 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d  &db->aDb[pTable-
3630: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20  >iDb].aFKey,.   
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
3660: 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  To, strlen(pFKey
3670: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
3680: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
3690: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a  ee(pFKey);.  }..
36a0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
36b0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
36c0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
36d0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
36e0: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
36f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
3700: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
3710: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3720: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
3730: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3740: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
3750: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3760: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3770: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3780: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
3790: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
37a0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
37b0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
37c0: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
37d0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
37e0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
37f0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
3800: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3810: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3820: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
3830: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
3840: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
3850: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
3860: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
3870: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
3880: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3890: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
38a0: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
38b0: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
38c0: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
38d0: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
38e0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
38f0: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
3900: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3910: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29  (zTabName)+1, 0)
3920: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
3930: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
3940: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
3950: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
3960: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
3970: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
3980: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
3990: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
39a0: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  pDb->aFKey, pF1-
39b0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
39c0: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
39d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
39e0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
39f0: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3a00: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3a10: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
3a20: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
3a30: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3a40: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3a50: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3a60: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3a70: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
3a80: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
3a90: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
3aa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3ab0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3ac0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3ad0: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
3ae0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3af0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3b00: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
3b10: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
3b20: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
3b30: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
3b40: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
3b50: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
3b60: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
3b70: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
3b80: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3b90: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
3ba0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3bb0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
3bc0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3bd0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
3be0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
3bf0: 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f  e really just po
3c00: 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  inters into the 
3c10: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
3c20: 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20  t and so.** are 
3c30: 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  not \000 termina
3c40: 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ted and are not 
3c50: 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65  persistent.  The
3c60: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
3c70: 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d  .** is \000 term
3c80: 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65  inated and is pe
3c90: 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61  rsistent..*/.cha
3ca0: 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72  r *sqlite3NameFr
3cb0: 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  omToken(Token *p
3cc0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
3cd0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
3ce0: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
3cf0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
3d00: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
3d10: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
3d20: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
3d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
3d40: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
3d50: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
3d60: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
3d70: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3d80: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
3d90: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
3da0: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
3db0: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
3dc0: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
3dd0: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
3de0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
3df0: 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
3e00: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db){.  sqlite3Vd
3e10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
3e20: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
3e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3e40: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
3e50: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
3e60: 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  OT);.  sqlite3Vd
3e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
3e80: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20  tNumColumns, 0, 
3e90: 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  5); /* sqlite_ma
3ea0: 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d  ster has 5 colum
3eb0: 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ns */.}../*.** T
3ec0: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
3ed0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
3ee0: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
3ef0: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
3f00: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
3f10: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
3f20: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
3f30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
3f40: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
3f50: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
3f60: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
3f70: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
3f80: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
3f90: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
3fa0: 6e 74 20 66 69 6e 64 44 62 28 73 71 6c 69 74 65  nt findDb(sqlite
3fb0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
3fc0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
3fd0: 20 44 62 20 2a 70 44 62 3b 0a 20 20 66 6f 72 28   Db *pDb;.  for(
3fe0: 70 44 62 3d 64 62 2d 3e 61 44 62 2c 20 69 3d 30  pDb=db->aDb, i=0
3ff0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
4000: 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66  , pDb++){.    if
4010: 28 20 70 4e 61 6d 65 2d 3e 6e 3d 3d 73 74 72 6c  ( pName->n==strl
4020: 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  en(pDb->zName) &
4030: 26 20 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71  & .        0==sq
4040: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 44  lite3StrNICmp(pD
4050: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  b->zName, pName-
4060: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20 29 7b  >z, pName->n) ){
4070: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b  .      return i;
4080: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4090: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn -1;.}../* Th
40a0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
40b0: 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  or trigger name 
40c0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
40d0: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
40e0: 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61  kens.** pName1 a
40f0: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
4100: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
4110: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4120: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  , for example:.*
4130: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
4140: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
4150: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  .** .** Then pNa
4160: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
4170: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
4180: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
4190: 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68  er hand if.** th
41a0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
41b0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
41c0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ied, i.e.:.**.**
41d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
41e0: 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  y(...);.**.** Th
41f0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4200: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
4210: 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a  ame2 is ""..**.*
4220: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
4230: 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61  ets the *ppUnqua
4240: 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  l pointer to poi
4250: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
4260: 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e  (pName1 or.** pN
4270: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
4280: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
4290: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  d table name.  T
42a0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
42b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78  ** database "xxx
42c0: 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  " is returned..*
42d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  /.int sqlite3Two
42e0: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
42f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4300: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
4310: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
4320: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
4330: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
4340: 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20  /* The "xxx" in 
4350: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
4360: 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20  y" or "xxx" */. 
4370: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
4380: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79       /* The "yyy
4390: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
43a0: 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b  xx.yyy" */.  Tok
43b0: 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20  en **pUnqual    
43c0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e   /* Write the un
43d0: 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74  qualified object
43e0: 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b   name here */.){
43f0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4410: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
4420: 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f  ng the object */
4430: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4440: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4450: 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
4460: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
4470: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
4480: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a  it.busy );.    *
4490: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
44a0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64  ;.    iDb = find
44b0: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
44c0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
44d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
44e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
44f0: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
4500: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
4510: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4520: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
4530: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
4540: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4550: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
4560: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
4570: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
4580: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
4590: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
45a0: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
45b0: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
45c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
45d0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
45e0: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
45f0: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
4600: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
4610: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
4620: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
4630: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
4640: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
4650: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
4660: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
4670: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
4680: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
4690: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
46a0: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
46b0: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
46c0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
46d0: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
46e0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
46f0: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
4700: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
4710: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
4720: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
4730: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
4740: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
4750: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
4760: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
4770: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
4780: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
4790: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
47a0: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
47b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
47c0: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
47d0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
47e0: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
47f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
4800: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
4810: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
4820: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4830: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
4840: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
4850: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
4860: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
4870: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
4880: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
4890: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
48a0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
48b0: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
48c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
48d0: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
48e0: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
48f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
4900: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
4910: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
4920: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
4930: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  he table name.  
4940: 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f  The.** pStart to
4950: 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54  ken is the CREAT
4960: 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74  E and pName is t
4970: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  he table name.  
4980: 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c  The isTemp.** fl
4990: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
49a0: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
49b0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
49c0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
49d0: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  se.** file inste
49e0: 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69  ad of in the mai
49f0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
4a00: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
4a10: 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  ly the case.** w
4a20: 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f  hen the "TEMP" o
4a30: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
4a40: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
4a50: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
4a60: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
4a70: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
4a80: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
4a90: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
4aa0: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
4ab0: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
4ac0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
4ad0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
4ae0: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
4af0: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
4b00: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
4b10: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
4b20: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
4b30: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
4b40: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
4b50: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
4b60: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
4b70: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
4b80: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
4b90: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
4ba0: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
4bb0: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
4bc0: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
4bd0: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74  oid sqlite3Start
4be0: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
4bf0: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
4c00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4c10: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
4c20: 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45    /* The "CREATE
4c30: 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b  " token */.  Tok
4c40: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
4c50: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
4c60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
4c70: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
4c80: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
4c90: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
4ca0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
4cb0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
4cc0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
4cd0: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
4ce0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
4cf0: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
4d00: 74 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f  t isView       /
4d10: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
4d20: 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20  s a VIEW */.){. 
4d30: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
4d40: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
4d50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
4d60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4d70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
4d80: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
4d90: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4da0: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
4db0: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
4dc0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
4dd0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
4de0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
4df0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
4e00: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
4e10: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
4e20: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
4e30: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4e40: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
4e50: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
4e60: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
4e70: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
4e80: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4e90: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
4ea0: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
4eb0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
4ec0: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
4ed0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4ee0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
4ef0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
4f00: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
4f10: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
4f20: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
4f30: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
4f40: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
4f50: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
4f60: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
4f70: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4f80: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
4f90: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
4fa0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
4fb0: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
4fc0: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
4fd0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
4fe0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
4ff0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5000: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5010: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
5020: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
5030: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
5040: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
5050: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
5060: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
5070: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
5080: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
5090: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
50a0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
50b0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
50c0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
50d0: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
50e0: 75 72 6e 3b 0a 20 20 69 66 28 20 69 73 54 65 6d  urn;.  if( isTem
50f0: 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20  p && iDb>1 ){.  
5100: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
5110: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
5120: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
5130: 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a  be qualified */.
5140: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5150: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d  Msg(pParse, "tem
5160: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  porary table nam
5170: 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c  e must be unqual
5180: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 70 50 61  ified");.    pPa
5190: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
51a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
51b0: 66 28 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  f( isTemp ) iDb 
51c0: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
51d0: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
51e0: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
51f0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5200: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
5210: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
5220: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
5230: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
5240: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
5250: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
5260: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
5270: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
5280: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
5290: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
52a0: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
52b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
52c0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
52d0: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
52e0: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
52f0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
5300: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
5310: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5320: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
5330: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
5340: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
5350: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
5360: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
5370: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5380: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
5390: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
53a0: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
53b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
53c0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
53d0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
53e0: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
53f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5400: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5410: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
5420: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5430: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  e{.      if( isT
5440: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
5450: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5460: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
5470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5480: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5490: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
54a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
54b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
54c0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
54d0: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
54e0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  zDb) ){.      sq
54f0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
5500: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
5510: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
5520: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
5530: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
5540: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
5550: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
5560: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
5570: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
5580: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
5590: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
55a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
55b0: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   ** it does..  *
55c0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
55d0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
55e0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 72  hema(pParse) ) r
55f0: 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20  eturn;.  pTable 
5600: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
5610: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  le(db, zName, db
5620: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5630: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20  );.  if( pTable 
5640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5650: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5660: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
5670: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
5680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
5690: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
56a0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  urn;.  }.  if( (
56b0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
56c0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
56d0: 65 2c 20 30 29 29 21 3d 30 20 26 26 20 0a 20 20  e, 0))!=0 && .  
56e0: 20 20 20 20 28 20 69 44 62 3d 3d 30 20 7c 7c 20      ( iDb==0 || 
56f0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
5700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5710: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5720: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
5730: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
5740: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
5750: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
5760: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
5770: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
5780: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5790: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
57a0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
57b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
57c0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
57d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
57e0: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ++;.    sqliteFr
57f0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
5800: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
5810: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
5820: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  me;.  pTable->nC
5830: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
5840: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
5850: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
5860: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ;.  pTable->pInd
5870: 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ex = 0;.  pTable
5880: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69  ->iDb = iDb;.  i
5890: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
58a0: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65  able ) sqlite3De
58b0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50  leteTable(db, pP
58c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
58d0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
58e0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
58f0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
5900: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
5910: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
5920: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
5930: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
5940: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
5950: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
5960: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
5970: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
5980: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
5990: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
59a0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
59b0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
59c0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
59d0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 73 74 72 63  EMENT.  if( strc
59e0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
59f0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
5a00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
5a10: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71  b->aDb[iDb].pSeq
5a20: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 64 62  Tab==0 );.    db
5a30: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54  ->aDb[iDb].pSeqT
5a40: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
5a50: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
5a60: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
5a70: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
5a80: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
5a90: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
5aa0: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
5ab0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
5ac0: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
5ad0: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
5ae0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
5af0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
5b00: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5b10: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
5b20: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
5b30: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
5b40: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
5b50: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
5b60: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
5b70: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
5b80: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
5b90: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
5ba0: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
5bb0: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
5bc0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
5bd0: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
5be0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
5bf0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
5c00: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
5c10: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
5c20: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
5c30: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
5c40: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
5c50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
5c60: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
5c70: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
5c80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 65 72 79  );..    /* Every
5c90: 20 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62 6c   time a new tabl
5ca0: 65 20 69 73 20 63 72 65 61 74 65 64 20 74 68 65  e is created the
5cb0: 20 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20   file-format.   
5cc0: 20 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67   ** and encoding
5cd0: 20 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72 65   meta-values are
5ce0: 20 73 65 74 20 69 6e 20 74 68 65 20 64 61 74 61   set in the data
5cf0: 62 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a 20  base, in.    ** 
5d00: 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68 65  case this is the
5d10: 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72 65   first table cre
5d20: 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
5d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d40: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
5d50: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
5d60: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
5d70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5d80: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
5d90: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
5da0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5db0: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63  Integer, db->enc
5dc0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
5dd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5de0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
5df0: 20 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69   4);..    /* Thi
5e00: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
5e10: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
5e20: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
5e30: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
5e40: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
5e50: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
5e60: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
5e70: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
5e80: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
5e90: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
5ea0: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
5eb0: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
5ec0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
5ed0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
5ee0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
5ef0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
5f00: 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  t on the top of 
5f10: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
5f20: 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75  * The rowid valu
5f30: 65 20 69 73 20 6e 65 65 64 65 64 20 62 79 20 74  e is needed by t
5f40: 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
5f50: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
5f60: 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74  l.    ** generat
5f70: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
5f80: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
5f90: 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  able(v, iDb);.  
5fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5fb0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
5fc0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
5fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5fe0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
6010: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
6020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6030: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
6040: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
6050: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
6060: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
6070: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
6080: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
6090: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
60a0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
60b0: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
60c0: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
60d0: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
60e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
60f0: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
6100: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
6110: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
6120: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
6130: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
6140: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6150: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
6160: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
6170: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
6180: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6190: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
61a0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
61b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43  ;.  char *z;.  C
61c0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
61d0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
61e0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
61f0: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
6200: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
6210: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
6220: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
6230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6240: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6250: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
6260: 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  mp(z, p->aCol[i]
6270: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
6280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6290: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
62a0: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
62b0: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
62c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
62d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
62e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
62f0: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
6300: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
6310: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
6320: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
6330: 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e  ( p->aCol, (p->n
6340: 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d  Col+8)*sizeof(p-
6350: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  >aCol[0]));.    
6360: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65  if( aNew==0 ) re
6370: 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  turn;.    p->aCo
6380: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
6390: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
63a0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
63b0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
63c0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
63d0: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
63e0: 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68   z;. .  /* If th
63f0: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
6400: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
6410: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
6420: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a  lt affinity.  **
6430: 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72   'NONE'. If ther
6440: 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63  e is a type spec
6450: 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69  ified, then sqli
6460: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
6470: 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  () will.  ** be 
6480: 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73  called next to s
6490: 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  et pCol->affinit
64a0: 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  y correctly..  *
64b0: 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  /.  pCol->affini
64c0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
64d0: 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43  NONE;.  pCol->pC
64e0: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
64f0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70  ->pDfltColl;.  p
6500: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nCol++;.}../*.
6510: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6520: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
6530: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
6540: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
6550: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
6560: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6570: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
6580: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
6590: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
65a0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
65b0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
65c0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
65d0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
65e0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
65f0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
6600: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
6610: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
6620: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
6630: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
6640: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6650: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
6660: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
6670: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
6680: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30  ol-1;.  if( i>=0
6690: 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f   ) p->aCol[i].no
66a0: 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b  tNull = onError;
66b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
66c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
66d0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
66e0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
66f0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
6700: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6710: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
6720: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
6730: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
6740: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
6750: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
6760: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
6770: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
6780: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
6790: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
67a0: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
67b0: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
67c0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
67d0: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
67e0: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
67f0: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
6800: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
6810: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
6820: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
6830: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
6840: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
6850: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
6860: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
6870: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
6880: 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  pFirst, Token *p
6890: 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Last){.  Table *
68a0: 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
68b0: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
68c0: 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d  z, **pz;.  Colum
68d0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
68e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
68f0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
6900: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
6910: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
6920: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
6930: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
6940: 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79   pz = &pCol->zTy
6950: 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d  pe;.  n = pLast-
6960: 3e 6e 20 2b 20 28 70 4c 61 73 74 2d 3e 7a 20 2d  >n + (pLast->z -
6970: 20 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 61   pFirst->z);.  a
6980: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79  ssert( pCol->zTy
6990: 70 65 3d 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70  pe==0 );.  z = p
69a0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
69b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 2e 2a  ite3MPrintf("%.*
69c0: 73 22 2c 20 6e 2c 20 70 46 69 72 73 74 2d 3e 7a  s", n, pFirst->z
69d0: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
69e0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
69f0: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
6a00: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69  .    int c = z[i
6a10: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  ];.    if( isspa
6a20: 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65  ce(c) ) continue
6a30: 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63  ;.    z[j++] = c
6a40: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
6a50: 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ;.  pCol->affini
6a60: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
6a70: 6e 69 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a  nityType(z, n);.
6a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76  }../*.** The giv
6a90: 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  en token is the 
6aa0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
6ab0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
6ac0: 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  n added to.** th
6ad0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
6ae0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6af0: 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73  tion.  If "minus
6b00: 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20 69  Flag" is true, i
6b10: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76  t.** means the v
6b20: 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70  alue token was p
6b30: 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e  receded by a min
6b40: 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54  us sign..**.** T
6b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6b60: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
6b70: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
6b80: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
6b90: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
6ba0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6bb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
6bc0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
6bd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6be0: 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d  ken *pVal, int m
6bf0: 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62  inusFlag){.  Tab
6c00: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
6c10: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
6c20: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
6c30: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
6c40: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
6c50: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
6c60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
6c70: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  ert( p->aCol[i].
6c80: 7a 44 66 6c 74 3d 3d 30 20 29 3b 0a 20 20 7a 20  zDflt==0 );.  z 
6c90: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  = p->aCol[i].zDf
6ca0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  lt = sqlite3MPri
6cb0: 6e 74 66 28 22 25 73 25 54 22 2c 20 6d 69 6e 75  ntf("%s%T", minu
6cc0: 73 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  sFlag ? "-" : ""
6cd0: 2c 20 70 56 61 6c 29 3b 0a 20 20 73 71 6c 69 74  , pVal);.  sqlit
6ce0: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 7d 0a  e3Dequote(z);.}.
6cf0: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
6d00: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6d10: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
6d20: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
6d30: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
6d40: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
6d50: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
6d60: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
6d70: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
6d80: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
6d90: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
6da0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
6db0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
6dc0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
6dd0: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
6de0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
6df0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
6e00: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
6e10: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
6e20: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
6e30: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
6e40: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
6e50: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
6e60: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6e70: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
6e80: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
6e90: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
6ea0: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
6eb0: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
6ec0: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
6ed0: 72 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74  row id.  (Except
6ee0: 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b  ion:.** For back
6ef0: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
6f00: 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64  ity with older d
6f10: 61 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74  atabases, do not
6f20: 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74   do this.** if t
6f30: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76  he file format v
6f40: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73  ersion number is
6f50: 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20   less than 1.)  
6f60: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
6f70: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
6f80: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
6f90: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
6fa0: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
6fb0: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
6fc0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
6fd0: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
6fe0: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
6ff0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
7000: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7010: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
7020: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
7030: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7040: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
7050: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
7060: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
7070: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
7080: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
7090: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
70a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
70b0: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
70c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
70d0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
70e0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
70f0: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
7100: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
7110: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
7120: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
7130: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
7140: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
7150: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
7160: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 20  /.  int autoInc 
7170: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7180: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
7190: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
71a0: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  esent */.){.  Ta
71b0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
71c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
71d0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
71e0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
71f0: 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  1, i;.  if( pTab
7200: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61  ==0 ) goto prima
7210: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69  ry_key_exit;.  i
7220: 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  f( pTab->hasPrim
7230: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
7240: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7250: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
7260: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
7270: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
7280: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
7290: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
72a0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
72b0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73  .  }.  pTab->has
72c0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69  PrimKey = 1;.  i
72d0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
72e0: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
72f0: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
7300: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
7310: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
7320: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
7330: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
7340: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
7350: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
7360: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
7370: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l++){.        if
7380: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
7390: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
73a0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
73b0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
73c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
73d0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
73e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
73f0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
7400: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7410: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
7420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
7430: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20  List->nExpr>1 ) 
7440: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  iCol = -1;.  }. 
7450: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
7460: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
7470: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
7480: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7490: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
74a0: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
74b0: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
74c0: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b  "INTEGER")==0 ){
74d0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
74e0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
74f0: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45  b->keyConf = onE
7500: 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e  rror;.    pTab->
7510: 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e  autoInc = autoIn
7520: 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  c;.  }else if( a
7530: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
7540: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
7550: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
7560: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7570: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
7580: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
7590: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
75a0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
75b0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
75c0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
75d0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
75e0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
75f0: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
7600: 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rror, 0, 0);.   
7610: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
7620: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
7630: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
7640: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
7650: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
7660: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
7670: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
7680: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7690: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
76a0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
76b0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
76c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
76d0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
76e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
76f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
7700: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
7710: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64   Table *p;.  Ind
7720: 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c  ex *pIdx;.  Coll
7730: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
7740: 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  t i;..  if( (p =
7750: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7760: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7770: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
7780: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
7790: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
77a0: 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c  q(pParse, zType,
77b0: 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43   nType);.  p->aC
77c0: 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43  ol[i].pColl = pC
77d0: 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  oll;..  /* If th
77e0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
77f0: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
7800: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
7810: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a  ATE <type>",.  *
7820: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
7830: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
7840: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
7850: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
7860: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
7870: 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43  ype was added. C
7880: 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69  orrect this if i
7890: 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  t is the case.. 
78a0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d   */.  for(pIdx =
78b0: 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78   p->pIndex; pIdx
78c0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
78d0: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
78e0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
78f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  1 );.    if( pId
7900: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
7910: 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  i ) pIdx->keyInf
7920: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f  o.aColl[0] = pCo
7930: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll;.  }.}../*.**
7940: 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75   Locate and retu
7950: 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  rn an entry from
7960: 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71   the db.aCollSeq
7970: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
7980: 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65  the entry.** spe
7990: 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20  cified by zName 
79a0: 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74  and nName is not
79b0: 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d   found and param
79c0: 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69 73  eter 'create' is
79d0: 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63  .** true, then c
79e0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  reate a new entr
79f0: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  y. Otherwise ret
7a00: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
7a10: 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f  Each pointer sto
7a20: 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
7a30: 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  e3.aCollSeq hash
7a40: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
7a50: 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74  an.** array of t
7a60: 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72  hree CollSeq str
7a70: 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69 72  uctures. The fir
7a80: 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74  st is the collat
7a90: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
7aa0: 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20 55  prefferred for U
7ab0: 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64  TF-8, the second
7ac0: 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74   UTF-16le, and t
7ad0: 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36 62  he third UTF-16b
7ae0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20  e..**.** Stored 
7af0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
7b00: 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c  r the three coll
7b10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
7b20: 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  is a copy of.** 
7b30: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7b40: 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70  quence name. A p
7b50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
7b60: 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20  tring is stored 
7b70: 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61  in.** each colla
7b80: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74  tion sequence st
7b90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
7ba0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e  ic CollSeq * fin
7bb0: 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20  dCollSeqEntry(. 
7bc0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
7bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
7be0: 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a  e,.  int nName,.
7bf0: 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a    int create.){.
7c00: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7c10: 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20  ;.  if( nName<0 
7c20: 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  ) nName = strlen
7c30: 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c  (zName);.  pColl
7c40: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
7c50: 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
7c60: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
7c70: 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c  ..  if( 0==pColl
7c80: 20 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20   && create ){.  
7c90: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
7ca0: 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66  Malloc( 3*sizeof
7cb0: 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65  (*pColl) + nName
7cc0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
7cd0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
7ce0: 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  Coll[0].zName = 
7cf0: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d  (char*)&pColl[3]
7d00: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d  ;.      pColl[0]
7d10: 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  .enc = SQLITE_UT
7d20: 46 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  F8;.      pColl[
7d30: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  1].zName = (char
7d40: 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20  *)&pColl[3];.   
7d50: 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20     pColl[1].enc 
7d60: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  = SQLITE_UTF16LE
7d70: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d  ;.      pColl[2]
7d80: 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  .zName = (char*)
7d90: 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20  &pColl[3];.     
7da0: 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20   pColl[2].enc = 
7db0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
7dc0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
7dd0: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ll[0].zName, zNa
7de0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
7df0: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65    pColl[0].zName
7e00: 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20  [nName] = 0;.   
7e10: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
7e20: 73 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  sert(&db->aCollS
7e30: 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61  eq, pColl[0].zNa
7e40: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c  me, nName, pColl
7e50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
7e60: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
7e70: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
7e80: 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20  zName points to 
7e90: 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
7ea0: 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74  string nName byt
7eb0: 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75  es long..** Retu
7ec0: 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20  rn the CollSeq* 
7ed0: 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20  pointer for the 
7ee0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7ef0: 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a  ce named zName.*
7f00: 2a 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64 69  * for the encodi
7f10: 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74 68  ng 'enc' from th
7f20: 65 20 64 61 74 61 62 61 73 65 20 27 64 62 27 2e  e database 'db'.
7f30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e  .**.** If the en
7f40: 74 72 79 20 73 70 65 63 69 66 69 65 64 20 69 73  try specified is
7f50: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 27   not found and '
7f60: 63 72 65 61 74 65 27 20 69 73 20 74 72 75 65 2c  create' is true,
7f70: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a 2a   then create a.*
7f80: 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f 74  * new entry.  Ot
7f90: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e  herwise return N
7fa0: 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ULL..*/.CollSeq 
7fb0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  *sqlite3FindColl
7fc0: 53 65 71 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  Seq(.  sqlite3 *
7fd0: 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  db,.  u8 enc,.  
7fe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
7ff0: 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a  e,.  int nName,.
8000: 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a    int create.){.
8010: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
8020: 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e   = findCollSeqEn
8030: 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  try(db, zName, n
8040: 4e 61 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a 20  Name, create);. 
8050: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
8060: 55 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49 54  UTF8==1 && SQLIT
8070: 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20  E_UTF16LE==2 && 
8080: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d  SQLITE_UTF16BE==
8090: 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  3 );.  assert( e
80a0: 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc>=SQLITE_UTF8 
80b0: 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55  && enc<=SQLITE_U
80c0: 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20  TF16BE );.  if( 
80d0: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d  pColl ) pColl +=
80e0: 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e   enc-1;.  return
80f0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
8100: 20 49 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f 6c   Invoke the 'col
8110: 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63  lation needed' c
8120: 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 71 75 65  allback to reque
8130: 73 74 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  st a collation s
8140: 65 71 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68  equence.** in th
8150: 65 20 64 61 74 61 62 61 73 65 20 74 65 78 74 20  e database text 
8160: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d 65  encoding of name
8170: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
8180: 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  Name..** If the 
8190: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
81a0: 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce.*/.static voi
81b0: 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64  d callCollNeeded
81c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
81d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
81e0: 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 61   int nName){.  a
81f0: 73 73 65 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c  ssert( !db->xCol
8200: 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e  lNeeded || !db->
8210: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b  xCollNeeded16 );
8220: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
8230: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
8240: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62  zName);.  if( db
8250: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b  ->xCollNeeded ){
8260: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74 65  .    char *zExte
8270: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  rnal = sqliteStr
8280: 4e 44 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  NDup(zName, nNam
8290: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78  e);.    if( !zEx
82a0: 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b  ternal ) return;
82b0: 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  .    db->xCollNe
82c0: 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65  eded(db->pCollNe
82d0: 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e  ededArg, db, (in
82e0: 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65  t)db->enc, zExte
82f0: 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  rnal);.    sqlit
8300: 65 46 72 65 65 28 7a 45 78 74 65 72 6e 61 6c 29  eFree(zExternal)
8310: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
8320: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 7b  xCollNeeded16 ){
8330: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
8340: 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20 20  *zExternal;.    
8350: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
8360: 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Tmp = sqlite3Get
8370: 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 64  TransientValue(d
8380: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
8390: 61 6c 75 65 53 65 74 53 74 72 28 70 54 6d 70 2c  alueSetStr(pTmp,
83a0: 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49   -1, zName, SQLI
83b0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
83c0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 45 78  STATIC);.    zEx
83d0: 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ternal = sqlite3
83e0: 56 61 6c 75 65 54 65 78 74 28 70 54 6d 70 2c 20  ValueText(pTmp, 
83f0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
8400: 56 45 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45  VE);.    if( !zE
8410: 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  xternal ) return
8420: 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ;.    db->xCollN
8430: 65 65 64 65 64 31 36 28 64 62 2d 3e 70 43 6f 6c  eeded16(db->pCol
8440: 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20  lNeededArg, db, 
8450: 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45  (int)db->enc, zE
8460: 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 7d 0a  xternal);.  }.}.
8470: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8480: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66  ine is called if
8490: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
84a0: 61 63 74 6f 72 79 20 66 61 69 6c 73 20 74 6f 20  actory fails to 
84b0: 64 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f 6c  deliver a.** col
84c0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
84d0: 69 6e 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f  in the best enco
84e0: 64 69 6e 67 20 62 75 74 20 74 68 65 72 65 20 6d  ding but there m
84f0: 61 79 20 62 65 20 6f 74 68 65 72 20 76 65 72 73  ay be other vers
8500: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ions.** of this 
8510: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
8520: 6f 6e 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65  on (for other te
8530: 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76  xt encodings) av
8540: 61 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65  ailable. Use one
8550: 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20 69 6e 73  .** of these ins
8560: 74 65 61 64 20 69 66 20 74 68 65 79 20 65 78 69  tead if they exi
8570: 73 74 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d  st. Avoid a UTF-
8580: 38 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f 6e  8 <-> UTF-16 con
8590: 76 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f  version if.** po
85a0: 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ssible..*/.stati
85b0: 63 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53  c int synthCollS
85c0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
85d0: 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  , CollSeq *pColl
85e0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
85f0: 6f 6c 6c 32 3b 0a 20 20 63 68 61 72 20 2a 7a 20  oll2;.  char *z 
8600: 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
8610: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
8620: 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  (z);.  sqlite3 *
8630: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8640: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
8650: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 63  ic const u8 aEnc
8660: 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55 54  [] = { SQLITE_UT
8670: 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55 54  F16BE, SQLITE_UT
8680: 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55 54  F16LE, SQLITE_UT
8690: 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  F8 };.  for(i=0;
86a0: 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<3; i++){.    
86b0: 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33  pColl2 = sqlite3
86c0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
86d0: 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30  aEnc[i], z, n, 0
86e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
86f0: 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20 20  2->xCmp!=0 ){.  
8700: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c      memcpy(pColl
8710: 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66  , pColl2, sizeof
8720: 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20 20  (CollSeq));.    
8730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8740: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
8750: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
8760: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8770: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8780: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
8790: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
87a0: 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20  %.*s", n, z);.  
87b0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  }.  pParse->nErr
87c0: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ++;.  return SQL
87d0: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
87e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
87f0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   is called on a 
8800: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8810: 63 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ce before it is 
8820: 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b  used to.** check
8830: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 66 69   that it is defi
8840: 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65  ned. An undefine
8850: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
8860: 65 6e 63 65 20 65 78 69 73 74 73 20 77 68 65 6e  ence exists when
8870: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 69  .** a database i
8880: 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f  s loaded that co
8890: 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65  ntains reference
88a0: 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  s to collation s
88b0: 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74  equences.** that
88c0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64   have not been d
88d0: 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65  efined by sqlite
88e0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
88f0: 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20  on() etc..**.** 
8900: 49 66 20 72 65 71 75 69 72 65 64 2c 20 74 68 69  If required, thi
8910: 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  s routine calls 
8920: 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e  the 'collation n
8930: 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20  eeded' callback 
8940: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20  to.** request a 
8950: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68  definition of th
8960: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8970: 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f  ence. If this do
8980: 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20  esn't work, .** 
8990: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  an equivalent co
89a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
89b0: 20 74 68 61 74 20 75 73 65 73 20 61 20 74 65 78   that uses a tex
89c0: 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65  t encoding diffe
89d0: 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  rent.** from the
89e0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
89f0: 73 20 73 75 62 73 74 69 74 75 74 65 64 2c 20 69  s substituted, i
8a00: 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62  f one is availab
8a10: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
8a20: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50  e3CheckCollSeq(P
8a30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
8a40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
8a50: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70   if( pColl && !p
8a60: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
8a70: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
8a80: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
8a90: 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  is type for this
8aa0: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67   encoding is reg
8ab0: 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20  istered..    ** 
8ac0: 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69  Call the collati
8ad0: 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65  on factory to se
8ae0: 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70  e if it can supp
8af0: 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a  ly us with one..
8b00: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43      */.    callC
8b10: 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65  ollNeeded(pParse
8b20: 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ->db, pColl->zNa
8b30: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c  me, strlen(pColl
8b40: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69  ->zName));.    i
8b50: 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  f( !pColl->xCmp 
8b60: 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  && synthCollSeq(
8b70: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
8b80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8b90: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
8ba0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8bb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8bc0: 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
8bd0: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66  CheckCollSeq() f
8be0: 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67  or all collating
8bf0: 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e   sequences in an
8c00: 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72   index,.** in or
8c10: 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68  der to verify th
8c20: 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73  at all the neces
8c30: 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73  sary collating s
8c40: 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20  equences are.** 
8c50: 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  loaded..*/.int s
8c60: 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78  qlite3CheckIndex
8c70: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
8c80: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
8c90: 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20  dx){.  if( pIdx 
8ca0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
8cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
8cc0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
8cd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
8ce0: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
8cf0: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65  pParse, pIdx->ke
8d00: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20  yInfo.aColl[i]) 
8d10: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8d20: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8d40: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8d50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8d60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
8d70: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
8d80: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
8d90: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
8da0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
8db0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
8dc0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
8dd0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
8de0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
8df0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
8e00: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
8e10: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
8e20: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
8e30: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
8e40: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
8e50: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8e60: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
8e70: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
8e80: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
8e90: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
8ea0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
8eb0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
8ec0: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
8ed0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
8ee0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
8ef0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
8f00: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
8f10: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
8f20: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
8f30: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
8f40: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
8f50: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
8f60: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
8f70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
8f80: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
8f90: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
8fa0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
8fb0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  o.** pParse..*/.
8fc0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
8fd0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
8fe0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
8ff0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
9000: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38  int nName){.  u8
9010: 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   enc = pParse->d
9020: 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69  b->enc;.  u8 ini
9030: 74 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e  tbusy = pParse->
9040: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
9050: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
9060: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
9070: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
9080: 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61   enc, zName, nNa
9090: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
90a0: 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e   if( nName<0 ) n
90b0: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
90c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  ame);.  if( !ini
90d0: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
90e0: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
90f0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63  ) ){.    /* No c
9100: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9110: 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 66  e of this type f
9120: 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67  or this encoding
9130: 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a   is registered..
9140: 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20      ** Call the 
9150: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9160: 79 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63  y to see if it c
9170: 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69 74  an supply us wit
9180: 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  h one..    */.  
9190: 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64    callCollNeeded
91a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
91b0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
91c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
91d0: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
91e0: 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  e->db, enc, zNam
91f0: 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e, nName, 0);.  
9200: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21    if( pColl && !
9210: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
9220: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 61       /* There ma
9230: 79 20 62 65 20 61 20 76 65 72 73 69 6f 6e 20 6f  y be a version o
9240: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
9250: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 72 65  sequence that re
9260: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
9270: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 65 74 77  translation betw
9280: 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2e 20 53  een encodings. S
9290: 65 61 72 63 68 20 66 6f 72 20 69 74 20 77 69 74  earch for it wit
92a0: 68 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  h synthCollSeq()
92b0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
92c0: 20 69 66 28 20 73 79 6e 74 68 43 6f 6c 6c 53 65   if( synthCollSe
92d0: 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29  q(pParse, pColl)
92e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
92f0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
9300: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9310: 20 6e 6f 74 68 69 6e 67 20 68 61 73 20 62 65 65   nothing has bee
9320: 6e 20 66 6f 75 6e 64 2c 20 77 72 69 74 65 20 74  n found, write t
9330: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
9340: 20 69 6e 74 6f 20 70 50 61 72 73 65 20 2a 2f 0a   into pParse */.
9350: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
9360: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
9370: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
9380: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
9390: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
93a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
93b0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
93c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
93d0: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d  nce: %.*s", nNam
93e0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
93f0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
9400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
9410: 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53  ll;.}..../*.** S
9420: 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  can the column t
9430: 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28  ype name zType (
9440: 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e  length nType) an
9450: 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  d return the.** 
9460: 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e  associated affin
9470: 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68 61  ity type..*/.cha
9480: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
9490: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
94a0: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
94b0: 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b  pe){.  int n, i;
94c0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
94d0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
94e0: 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 20 20  st char *zSub;  
94f0: 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75 62 73  /* Keywords subs
9500: 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63 68 20  tring to search 
9510: 66 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  for */.    char 
9520: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  nSub;         /*
9530: 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75 62 20   length of zSub 
9540: 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 69  */.    char affi
9550: 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41 66 66  nity;     /* Aff
9560: 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72 6e 20  inity to return 
9570: 69 66 20 69 74 20 6d 61 74 63 68 65 73 20 2a 2f  if it matches */
9580: 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67 73 5b  .  } substrings[
9590: 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54 22  ] = {.    {"INT"
95a0: 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41 46 46  ,  3, SQLITE_AFF
95b0: 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20 7b  _INTEGER},.    {
95c0: 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c 49 54  "CHAR", 4, SQLIT
95d0: 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20  E_AFF_TEXT},.   
95e0: 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51 4c   {"CLOB", 4, SQL
95f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20  ITE_AFF_TEXT},. 
9600: 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c 20 53     {"TEXT", 4, S
9610: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
9620: 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34 2c  .    {"BLOB", 4,
9630: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
9640: 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6e  },.  };..  if( n
9650: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Type==0 ){.    r
9660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
9670: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f 72  _NONE;.  }.  for
9680: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 73  (i=0; i<sizeof(s
9690: 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a 65 6f  ubstrings)/sizeo
96a0: 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30 5d 29  f(substrings[0])
96b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
96c0: 63 31 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b  c1 = substrings[
96d0: 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20 20 20  i].zSub[0];.    
96e0: 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77 65 72  int c2 = tolower
96f0: 28 63 31 29 3b 0a 20 20 20 20 69 6e 74 20 6c 69  (c1);.    int li
9700: 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d 20 73 75  mit = nType - su
9710: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62  bstrings[i].nSub
9720: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
9730: 20 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e 67 73   *z = substrings
9740: 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20 66 6f  [i].zSub;.    fo
9750: 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74 3b  r(n=0; n<=limit;
9760: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   n++){.      int
9770: 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a 20   c = zType[n];. 
9780: 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 31 20       if( (c==c1 
9790: 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20 20 20  || c==c2).      
97a0: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
97b0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 7a 54  ite3StrNICmp(&zT
97c0: 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73 74  ype[n], z, subst
97d0: 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20 29  rings[i].nSub) )
97e0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
97f0: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61   substrings[i].a
9800: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d  ffinity;.      }
9810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9820: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
9830: 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  UMERIC;.}../*.**
9840: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9850: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
9860: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
9870: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
9880: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
9890: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
98a0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
98b0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
98c0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
98d0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
98e0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
98f0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
9900: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
9910: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
9920: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
9930: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
9940: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
9950: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
9960: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
9970: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
9980: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
9990: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
99a0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
99b0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
99c0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
99d0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
99e0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
99f0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
9a00: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
9a10: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
9a20: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
9a30: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
9a40: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
9a50: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
9a60: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
9a70: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
9a80: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
9a90: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
9aa0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
9ab0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
9ac0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
9ad0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
9ae0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
9af0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
9b00: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
9b10: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
9b20: 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  okie(sqlite3 *db
9b30: 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  , Vdbe *v, int i
9b40: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db){.  sqlite3Vd
9b50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9b60: 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69  teger, db->aDb[i
9b70: 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
9b80: 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  e+1, 0);.  sqlit
9b90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9ba0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
9bb0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  , 0);.}../*.** M
9bc0: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
9bd0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
9be0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
9bf0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
9c00: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
9c10: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
9c20: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
9c30: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
9c40: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
9c50: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
9c60: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
9c70: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
9c80: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
9c90: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
9ca0: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
9cb0: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
9cc0: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
9cd0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
9ce0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
9cf0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
9d00: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
9d10: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
9d20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9d30: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
9d40: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
9d50: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
9d60: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
9d70: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
9d80: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
9d90: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
9da0: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
9db0: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
9dc0: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67  pIdx, char *zSig
9dd0: 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73  nedIdent){.  uns
9de0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65  igned char *zIde
9df0: 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  nt = (unsigned c
9e00: 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e  har*)zSignedIden
9e10: 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  t;.  int i, j, n
9e20: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
9e30: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
9e40: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
9e50: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
9e60: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
9e70: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
9e80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
9e90: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
9ea0: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
9eb0: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
9ee0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
9ef0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
9f00: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
9f10: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  ++] = '"';.  for
9f20: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
9f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
9f40: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
9f50: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
9f60: 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  =='"' ) z[i++] =
9f70: 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '"';.  }.  if( 
9f80: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
9f90: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d  +] = '"';.  z[i]
9fa0: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
9fb0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
9fc0: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
9fd0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
9fe0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
9ff0: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
a000: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
a010: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
a020: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
a030: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
a040: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
a050: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
a060: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
a070: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
a080: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
a090: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
a0a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
a0b0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
a0c0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
a0d0: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20   *zSep2, *zEnd, 
a0e0: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
a0f0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
a100: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
a110: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
a120: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
a130: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
a140: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
a150: 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c  e);.    z = pCol
a160: 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28  ->zType;.    if(
a170: 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d   z ){.      n +=
a180: 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29   (strlen(z) + 1)
a190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20  ;.    }.  }.  n 
a1a0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
a1b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
a1c0: 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70  n<50 ){.    zSep
a1d0: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
a1e0: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
a1f0: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
a200: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
a210: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
a220: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
a230: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
a240: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
a250: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
a260: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
a270: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
a280: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
a290: 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c  .  strcpy(zStmt,
a2a0: 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52   p->iDb==1 ? "CR
a2b0: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
a2c0: 22 20 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c  " : "CREATE TABL
a2d0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
a2e0: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
a2f0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a300: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
a310: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
a320: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
a330: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a340: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a350: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
a360: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
a370: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
a380: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
a390: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
a3a0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
a3b0: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
a3c0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20  );.    if( (z = 
a3d0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20  pCol->zType)!=0 
a3e0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b  ){.      zStmt[k
a3f0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
a400: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
a410: 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b  ], z);.      k +
a420: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
a430: 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28   }.  }.  strcpy(
a440: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29  &zStmt[k], zEnd)
a450: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
a460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a470: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a480: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
a490: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
a4a0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
a4b0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a4c0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
a4d0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
a4e0: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
a4f0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
a500: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
a510: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
a520: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
a530: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
a540: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
a550: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
a560: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
a570: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
a580: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
a590: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
a5a0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
a5b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
a5c0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
a5d0: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
a5e0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
a5f0: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
a600: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
a610: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a620: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
a630: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
a640: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
a650: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
a660: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a670: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
a680: 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68  y changes, so th
a690: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
a6a0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
a6b0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
a6c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a6d0: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
a6e0: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
a6f0: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
a700: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
a710: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
a720: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
a730: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
a740: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
a750: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
a760: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
a770: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
a780: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
a790: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
a7a0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
a7b0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
a7c0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
a7d0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a7e0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
a7f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
a800: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
a810: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  arse, Token *pEn
a820: 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  d, Select *pSele
a830: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ct){.  Table *p;
a840: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a850: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
a860: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
a870: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70  pSelect==0) || p
a880: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
a890: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
a8a0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
a8b0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
a8c0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
a8d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
a8e0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
a8f0: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
a900: 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ct );..  /* If t
a910: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
a920: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
a930: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
a940: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
a950: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
a960: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
a970: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
a980: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
a990: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
a9a0: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
a9b0: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
a9c0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
a9d0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
a9e0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
a9f0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
aa00: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
aa10: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
aa20: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
aa30: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
aa40: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
aa50: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
aa60: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
aa70: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
aa80: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
aa90: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
aaa0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
aab0: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
aac0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
aad0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
aae0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
aaf0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
ab00: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
ab10: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
ab20: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
ab30: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
ab40: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
ab50: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
ab60: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
ab70: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
ab80: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
ab90: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
aba0: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
abb0: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
abc0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
abd0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
abe0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
abf0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
ac00: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
ac10: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20   char *zType;   
ac20: 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74   /* "view" or "t
ac30: 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61  able" */.    cha
ac40: 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20  r *zType2;   /* 
ac50: 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45  "VIEW" or "TABLE
ac60: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
ac70: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74  Stmt;    /* Text
ac80: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
ac90: 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56  ABLE or CREATE V
aca0: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  IEW statement */
acb0: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
acc0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
acd0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ace0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a   return;..    /*
acf0: 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
ad00: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
ad10: 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20   table and push 
ad20: 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  it onto the stac
ad30: 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77  k..    ** A view
ad40: 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65   has no rootpage
ad50: 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61  , so just push a
ad60: 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73   zero onto the s
ad70: 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  tack for.    ** 
ad80: 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69  views.  Initiali
ad90: 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20  ze zType at the 
ada0: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a  same time..    *
adb0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
adc0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
add0: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
ade0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ble */.      sql
adf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ae00: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
ae10: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
ae20: 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
ae30: 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
ae40: 20 3d 20 22 54 41 42 4c 45 22 3b 0a 20 20 20 20   = "TABLE";.    
ae50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
ae60: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
ae70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ae90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 54 79  0, 0);.      zTy
aea0: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
aeb0: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
aec0: 57 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  W";.    }..    s
aed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
aee0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
aef0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  0);..    /* If t
af00: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
af10: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
af20: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
af30: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
af40: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
af50: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
af60: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
af70: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
af80: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
af90: 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74  able is on the t
afa0: 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73  op of the vdbe s
afb0: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tack..    **.   
afc0: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
afd0: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
afe0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
aff0: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
b000: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
b010: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
b020: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
b030: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
b040: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
b050: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
b060: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
b070: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
b080: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
b090: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
b0a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b0b0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
b0c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b0d0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b0e0: 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  r, p->iDb, 0);. 
b0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b100: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b110: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
b120: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
b130: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
b140: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
b150: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
b160: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
b170: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b180: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b190: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
b1a0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
b1b0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
b1c0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
b1d0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
b1e0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
b1f0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
b200: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
b210: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
b220: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b230: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
b240: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
b250: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
b260: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
b270: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
b280: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
b290: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
b2a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
b2b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
b2c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
b2d0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
b2e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
b2f0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
b300: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
b310: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
b320: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
b330: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
b340: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
b350: 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20  ableStmt(p);.   
b360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
b370: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
b380: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
b390: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
b3a0: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
b3b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
b3c0: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
b3d0: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
b3e0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
b3f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b400: 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
b410: 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
b420: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
b430: 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
b440: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
b450: 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
b460: 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
b470: 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
b480: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
b490: 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
b4a0: 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f  llected.  The ro
b4b0: 77 69 64 20 66 6f 72 20 74 68 65 20 70 72 65 61  wid for the prea
b4c0: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
b4d0: 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20  slot is the 2nd 
b4e0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
b4f0: 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74  k.  The top of t
b500: 68 65 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a  he stack is the.
b510: 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
b520: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b530: 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20 74 68  le (or a 0 if th
b540: 69 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20  is is a view).. 
b550: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
b560: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
b570: 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
b580: 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20  TE %Q.%s ".     
b590: 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25      "SET type='%
b5a0: 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  s', name=%Q, tbl
b5b0: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
b5c0: 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a  ge=#0, sql=%Q ".
b5d0: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
b5e0: 77 69 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64  wid=#1",.      d
b5f0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a  b->aDb[p->iDb].z
b600: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
b610: 4c 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20  LE(p->iDb),.    
b620: 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70    zType,.      p
b630: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
b640: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a  ->zName,.      z
b650: 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
b660: 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74  sqliteFree(zStmt
b670: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  );..    /* Repar
b680: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
b690: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
b6a0: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
b6b0: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
b6c0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
b6d0: 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a  db, v, p->iDb);.
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
b6f0: 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
b700: 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c  hema, p->iDb, 0,
b710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b720: 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d  MPrintf("tbl_nam
b730: 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65  e='%q'",p->zName
b740: 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
b750: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
b760: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
b770: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
b780: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
b790: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
b7a0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
b7b0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
b7c0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
b7d0: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
b7e0: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44  y *pFKey; .    D
b7f0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
b800: 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70  b[p->iDb];.    p
b810: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
b820: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62  hInsert(&pDb->tb
b830: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
b840: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
b850: 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  )+1, p);.    if(
b860: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
b870: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
b880: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
b890: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
b8a0: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
b8b0: 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  ) */.      retur
b8c0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  n;.    }.    for
b8d0: 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b  (pFKey=p->pFKey;
b8e0: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46   pFKey; pFKey=pF
b8f0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  Key->pNextFrom){
b900: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
b910: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
b920: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
b930: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
b940: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
b950: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  &pDb->aFKey, pFK
b960: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
b970: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
b980: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b  Insert(&pDb->aFK
b990: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
b9a0: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
b9b0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
b9c0: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
b9d0: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
b9e0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
b9f0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
ba00: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  anges;.  }.}..#i
ba10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ba20: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
ba30: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
ba40: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
ba50: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
ba60: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
ba70: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
ba80: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
ba90: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
baa0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
bab0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
bac0: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
bad0: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
bae0: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
baf0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
bb00: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
bb10: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
bb20: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
bb30: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
bb40: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
bb50: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
bb60: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
bb70: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
bb80: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
bb90: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
bba0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
bbb0: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
bbc0: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
bbd0: 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20   int isTemp     
bbe0: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
bbf0: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
bc00: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
bc10: 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
bc20: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
bc30: 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
bc40: 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
bc50: 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
bc60: 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74  me;..  sqlite3St
bc70: 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
bc80: 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c   pBegin, pName1,
bc90: 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c   pName2, isTemp,
bca0: 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   1);.  p = pPars
bcb0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
bcc0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
bcd0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
bce0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
bcf0: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
bd00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
bd10: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
bd20: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
bd30: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
bd40: 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
bd50: 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
bd60: 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20  pParse, p->iDb, 
bd70: 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20  "view", pName). 
bd80: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
bd90: 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
bda0: 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20  elect).  ){.    
bdb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
bdc0: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
bdd0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
bde0: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
bdf0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
be00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
be10: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
be20: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
be30: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
be40: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
be50: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
be60: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
be70: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
be80: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
be90: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
bea0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
beb0: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
bec0: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
bed0: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
bee0: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
bef0: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
bf00: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
bf10: 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c  e3SelectDup(pSel
bf20: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ect);.  sqlite3S
bf30: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
bf40: 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ect);.  if( !pPa
bf50: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
bf60: 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
bf70: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
bf80: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
bf90: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
bfa0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bfb0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
bfc0: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
bfd0: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
bfe0: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
bff0: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
c000: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
c010: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26   sEnd.z[0]!=0 &&
c020: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
c030: 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
c040: 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
c050: 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
c060: 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e   sEnd.z - pBegin
c070: 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73  ->z;.  z = (cons
c080: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
c090: 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68  )pBegin->z;.  wh
c0a0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e  ile( n>0 && (z[n
c0b0: 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70  -1]==';' || issp
c0c0: 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20  ace(z[n-1])) ){ 
c0d0: 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
c0e0: 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
c0f0: 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
c100: 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
c110: 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
c120: 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
c130: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
c140: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
c150: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45  able(pParse, &sE
c160: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
c170: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c180: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
c190: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
c1a0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
c1b0: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
c1c0: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
c1d0: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
c1e0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
c1f0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
c200: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
c210: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
c220: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
c230: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
c240: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
c250: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
c260: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
c270: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
c280: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
c290: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
c2a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
c2b0: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
c2c0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72  *pTable){.  Expr
c2d0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
c2e0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
c2f0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
c300: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
c310: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
c320: 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73  e );..  /* A pos
c330: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
c340: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
c350: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
c360: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
c370: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
c380: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
c390: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
c3a0: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
c3b0: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
c3c0: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
c3d0: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
c3e0: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
c3f0: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
c400: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
c410: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
c420: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
c430: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
c440: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
c450: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
c460: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
c470: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
c480: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
c490: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
c4a0: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
c4b0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
c4c0: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
c4d0: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
c4e0: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
c4f0: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
c500: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
c510: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
c520: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
c530: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
c540: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
c550: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
c560: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
c570: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
c580: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
c590: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c5a0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
c5b0: 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
c5c0: 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
c5d0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
c5e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
c5f0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
c600: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
c610: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
c620: 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
c630: 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  mes..  */.  asse
c640: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
c650: 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f  ect ); /* If nCo
c660: 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c  l==0, then pTabl
c670: 65 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57  e must be a VIEW
c680: 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61   */.  pSel = pTa
c690: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  ble->pSelect;.. 
c6a0: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   /* Note that th
c6b0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
c6c0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
c6d0: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
c6e0: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
c6f0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c  ements in this l
c700: 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ist.  But we wil
c710: 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72  l need to restor
c720: 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20  e the list.  ** 
c730: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
c740: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
c750: 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73  on afterwards, s
c760: 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79  o we save a copy
c770: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69   of.  ** the ori
c780: 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e  ginal in pEList.
c790: 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  .  */.  pEList =
c7a0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSel->pEList;. 
c7b0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
c7c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c7d0: 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66  up(pEList);.  if
c7e0: 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d  ( pSel->pEList==
c7f0: 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  0 ){.    pSel->p
c800: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
c810: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
c820: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
c830: 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  */.  }.  pTable-
c840: 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53  >nCol = -1;.  pS
c850: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
c860: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
c870: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
c880: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  );.  if( pSelTab
c890: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c8a0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
c8b0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
c8c0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
c8d0: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
c8e0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
c8f0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
c900: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
c910: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c920: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
c930: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
c940: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53  SelTab);.    DbS
c950: 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73  etProperty(pPars
c960: 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69  e->db, pTable->i
c970: 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  Db, DB_UnresetVi
c980: 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ews);.  }else{. 
c990: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
c9a0: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
c9b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
c9c0: 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29  lectUnbind(pSel)
c9d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
c9e0: 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  istDelete(pSel->
c9f0: 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d  pEList);.  pSel-
ca00: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
ca10: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  ;.  return nErr;
ca20: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53    .}.#endif /* S
ca30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
ca40: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ca50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
ca60: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
ca70: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
ca80: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
ca90: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
caa0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
cab0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
cac0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
cad0: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
cae0: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
caf0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
cb00: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
cb10: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
cb20: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
cb30: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
cb40: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
cb50: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
cb60: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
cb70: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
cb80: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
cb90: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
cba0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  ){.      sqliteR
cbb0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
cbc0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
cbd0: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
cbe0: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
cbf0: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
cc00: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
cc10: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
cc20: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
cc30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
cc40: 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
cc50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
cc60: 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
cc70: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
cc80: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
cc90: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
cca0: 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
ccb0: 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
ccc0: 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
ccd0: 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
cce0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
ccf0: 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
cd00: 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
cd10: 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
cd20: 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  iTo..*/.#ifndef 
cd30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cd40: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
cd50: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
cd60: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
cd70: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
cd80: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
cd90: 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ;.  .  for(pElem
cda0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
cdb0: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b  (&pDb->tblHash);
cdc0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
cdd0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
cde0: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
cdf0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
ce00: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
ce10: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
ce20: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
ce30: 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
ce40: 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  To;.      return
ce50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
ce60: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
ce70: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69 64  shFirst(&pDb->id
ce80: 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  xHash); pElem; p
ce90: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
cea0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
ceb0: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
cec0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
ced0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
cee0: 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
cef0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
cf00: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20  num = iTo;.     
cf10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
cf20: 20 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a   }.  assert(0);.
cf30: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
cf40: 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
cf50: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
cf60: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
cf70: 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
cf80: 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
cf90: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
cfa0: 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
cfb0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
cfc0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
cfd0: 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
cfe0: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
cff0: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
d000: 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
d010: 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
d020: 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
d030: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
d040: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
d050: 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
d060: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
d070: 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
d080: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
d090: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
d0a0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
d0b0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d0c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d0d0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
d0e0: 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b  y, iTable, iDb);
d0f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d100: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d110: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
d120: 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65  pushes an intege
d130: 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
d140: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
d150: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
d160: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
d170: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
d180: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
d190: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
d1a0: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
d1b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
d1c0: 20 6d 6f 64 69 66 69 73 20 74 68 65 20 73 71 6c   modifis the sql
d1d0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d1e0: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
d1f0: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
d200: 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68 65   The "#0" in the
d210: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
d220: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
d230: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
d240: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20  alue.  ** is on 
d250: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
d260: 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74  tack.  See sqlit
d270: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
d280: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
d290: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
d2a0: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
d2b0: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
d2c0: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 30  page=%d WHERE #0
d2d0: 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30   AND rootpage=#0
d2e0: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
d2f0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
d300: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
d310: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a  (iDb), iTable);.
d320: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d330: 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
d340: 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
d350: 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
d360: 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
d370: 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
d380: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
d390: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d3a0: 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
d3b0: 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
d3c0: 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
d3d0: 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
d3e0: 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
d3f0: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
d400: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
d410: 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
d420: 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
d430: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
d440: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
d450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d460: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
d470: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
d480: 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
d490: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d4a0: 54 4f 56 41 43 55 55 4d 0a 20 20 64 65 73 74 72  TOVACUUM.  destr
d4b0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
d4c0: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70  e, pTab->tnum, p
d4d0: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72  Tab->iDb);.  for
d4e0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d4f0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d500: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
d510: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d520: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
d530: 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b  num, pIdx->iDb);
d540: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
d550: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d560: 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
d570: 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
d580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d590: 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
d5a0: 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
d5b0: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
d5c0: 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
d5d0: 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
d5e0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
d5f0: 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
d600: 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
d610: 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
d620: 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
d630: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
d640: 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
d650: 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
d660: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
d670: 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
d680: 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
d690: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
d6a0: 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
d6b0: 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
d6c0: 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
d6d0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
d6e0: 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
d6f0: 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
d700: 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
d710: 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
d720: 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
d730: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
d740: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
d750: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
d760: 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
d770: 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
d780: 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
d790: 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
d7a0: 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
d7b0: 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
d7c0: 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
d7d0: 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
d7e0: 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
d7f0: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
d800: 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
d810: 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
d820: 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
d830: 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
d840: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
d850: 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
d860: 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
d870: 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
d880: 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
d890: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
d8a0: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
d8b0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d8c0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d8d0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
d8e0: 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
d8f0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
d900: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 44  assert( pIdx->iD
d910: 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
d920: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
d930: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
d940: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
d950: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
d960: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
d970: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
d980: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d990: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 20  ( iLargest==0 ) 
d9a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 65 73 74  return;.    dest
d9b0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
d9c0: 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 70 54  se, iLargest, pT
d9d0: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 44  ab->iDb);.    iD
d9e0: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
d9f0: 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  est;.  }.#endif.
da00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
da10: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
da20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
da30: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
da40: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
da50: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
da60: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
da70: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
da80: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
da90: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
daa0: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
dab0: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  e, int isView){.
dac0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
dad0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
dae0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
daf0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
db00: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
db10: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
db20: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
db30: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
db40: 61 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  able;.  assert( 
db50: 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
db60: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
db70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
db80: 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
db90: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
dba0: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
dbb0: 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
dbc0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
dbd0: 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20  _table;.  iDb = 
dbe0: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73  pTab->iDb;.  ass
dbf0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
dc00: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69  Db<db->nDb );.#i
dc10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dc20: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
dc30: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
dc40: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
dc50: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
dc60: 54 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29  TABLE(pTab->iDb)
dc70: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
dc80: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
dc90: 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
dca0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
dcb0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
dcc0: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
dcd0: 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
dce0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
dcf0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
dd00: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
dd10: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
dd20: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
dd30: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
dd40: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
dd50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd60: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
dd70: 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
dd80: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
dd90: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
dda0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
ddb0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
ddc0: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
ddd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dde0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
ddf0: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
de00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
de10: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
de20: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
de30: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
de40: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
de50: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
de60: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
de70: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
de80: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
de90: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
dea0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
deb0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
dec0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ded0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
dee0: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
def0: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
df00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
df10: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
df20: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
df30: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
df40: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
df50: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
df60: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
df70: 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  }.  if( isView &
df80: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
df90: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
dfa0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
dfb0: 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
dfc0: 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
dfd0: 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
dfe0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
dff0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e000: 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
e010: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
e020: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
e030: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e040: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
e050: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
e060: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
e070: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
e080: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
e090: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e0a0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e0b0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
e0c0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
e0d0: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
e0e0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
e0f0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e100: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
e110: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
e120: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
e130: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
e140: 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d  pParse, 0, pTab-
e150: 3e 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  >iDb);..    /* D
e160: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
e170: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e180: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
e190: 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
e1a0: 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
e1b0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
e1c0: 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
e1d0: 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
e1e0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
e1f0: 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
e200: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
e210: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
e220: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
e230: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
e240: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e250: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
e260: 70 54 61 62 2d 3e 69 44 62 20 7c 7c 20 70 54 72  pTab->iDb || pTr
e270: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b  igger->iDb==1 );
e280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
e290: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
e2a0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
e2b0: 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  );.      pTrigge
e2c0: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
e2d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
e2e0: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
e2f0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
e300: 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
e310: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
e320: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
e330: 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
e340: 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
e350: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e360: 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
e370: 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
e380: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
e390: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
e3a0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
e3b0: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
e3c0: 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
e3d0: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
e3e0: 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
e3f0: 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
e400: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
e410: 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
e420: 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
e430: 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
e440: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
e450: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
e460: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
e470: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
e480: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
e490: 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
e4a0: 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
e4b0: 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
e4c0: 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
e4d0: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
e4e0: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
e4f0: 28 70 54 61 62 2d 3e 69 44 62 29 2c 20 70 54 61  (pTab->iDb), pTa
e500: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b->zName);.    i
e510: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
e520: 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
e530: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
e540: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e550: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44  3VdbeOp3(v, OP_D
e560: 72 6f 70 54 61 62 6c 65 2c 20 70 54 61 62 2d 3e  ropTable, pTab->
e570: 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  iDb, 0, pTab->zN
e580: 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
e590: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
e5a0: 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
e5b0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
e5c0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
e5d0: 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
e5e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e5f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
e600: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
e610: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
e620: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
e630: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
e640: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
e650: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
e660: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
e670: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
e680: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
e690: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
e6a0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
e6b0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
e6c0: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
e6d0: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
e6e0: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
e6f0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
e700: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
e710: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
e720: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
e730: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
e740: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
e750: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
e760: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
e770: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
e780: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
e790: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
e7a0: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
e7b0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
e7c0: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
e7d0: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
e7e0: 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
e7f0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
e800: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
e810: 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
e820: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
e830: 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
e840: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
e850: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
e860: 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
e870: 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
e880: 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
e890: 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
e8a0: 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
e8b0: 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
e8c0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
e8d0: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
e8e0: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
e8f0: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
e900: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
e910: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
e920: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
e930: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
e940: 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
e950: 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
e960: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e970: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
e980: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
e990: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
e9a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e9b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
e9c0: 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
e9d0: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
e9e0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
e9f0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
ea00: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
ea10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
ea20: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
ea30: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
ea40: 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
ea50: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
ea60: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
ea70: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
ea80: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
ea90: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
eaa0: 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ms. */.){.#ifnde
eab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
eac0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
ead0: 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54   *pFKey = 0;.  T
eae0: 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
eaf0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
eb00: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
eb10: 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
eb20: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
eb30: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
eb40: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
eb50: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
eb60: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
eb70: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
eb80: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
eb90: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
eba0: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
ebb0: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
ebc0: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
ebd0: 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
ebe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ebf0: 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
ec00: 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
ec10: 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
ec20: 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
ec30: 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
ec40: 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
ec50: 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
ec60: 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
ec70: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
ec80: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
ec90: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
eca0: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
ecb0: 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
ecc0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
ecd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ece0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
ecf0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
ed00: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
ed10: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
ed20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
ed30: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
ed40: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
ed50: 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
ed60: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
ed70: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
ed80: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
ed90: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
eda0: 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
edb0: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
edc0: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
edd0: 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
ede0: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
edf0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
ee00: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
ee10: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
ee20: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
ee30: 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
ee40: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
ee50: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ee60: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
ee70: 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66  FKey==0 ) goto f
ee80: 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e  k_end;.  pFKey->
ee90: 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
eea0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
eeb0: 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
eec0: 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d  (char*)&pFKey[1]
eed0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20  ;.  pFKey->aCol 
eee0: 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  = (struct sColMa
eef0: 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a  p*)z;.  z += siz
ef00: 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d  eof(struct sColM
ef10: 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65  ap)*nCol;.  pFKe
ef20: 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
ef30: 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
ef40: 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
ef50: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d  ->n] = 0;.  z +=
ef60: 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
ef70: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b  ey->pNextTo = 0;
ef80: 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
ef90: 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
efa0: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
efb0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
efc0: 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
efd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
efe0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
eff0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
f000: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
f010: 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
f020: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
f030: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
f040: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
f050: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
f060: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
f070: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
f080: 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
f090: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f0a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f0b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
f0c0: 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
f0d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f0e0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
f0f0: 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
f100: 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
f110: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
f120: 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
f130: 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
f140: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
f150: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
f160: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f170: 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
f180: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
f190: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
f1a0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
f1b0: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
f1c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
f1d0: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
f1e0: 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
f1f0: 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
f200: 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
f210: 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
f220: 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
f230: 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
f240: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
f250: 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
f260: 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
f270: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
f280: 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
f290: 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
f2a0: 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
f2b0: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
f2c0: 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
f2d0: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
f2e0: 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
f2f0: 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
f300: 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
f310: 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
f320: 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
f330: 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46  k_end:.  sqliteF
f340: 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64  ree(pFKey);.#end
f350: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
f360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
f370: 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
f380: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
f390: 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  te(pFromCol);.  
f3a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
f3b0: 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
f3c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f3d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
f3e0: 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
f3f0: 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
f400: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
f410: 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
f420: 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
f430: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
f440: 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
f450: 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
f460: 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
f470: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
f480: 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
f490: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
f4a0: 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
f4b0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f4c0: 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
f4d0: 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
f4e0: 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
f4f0: 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
f500: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
f510: 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
f520: 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
f530: 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
f540: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
f550: 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
f560: 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
f570: 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
f580: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f590: 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
f5a0: 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
f5b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46  0 ) return;.  pF
f5c0: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
f5d0: 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  = isDeferred;.#e
f5e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
f5f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f600: 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
f610: 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
f620: 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
f630: 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
f640: 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
f650: 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
f660: 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
f670: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
f680: 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
f690: 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
f6a0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
f6b0: 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
f6c0: 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
f6d0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
f6e0: 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
f6f0: 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65  created.  The me
f700: 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66  mory cell specif
f710: 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
f720: 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
f730: 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
f740: 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
f750: 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
f760: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
f770: 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
f780: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
f790: 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
f7a0: 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
f7b0: 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
f7c0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
f7d0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
f7e0: 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
f7f0: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
f800: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
f810: 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
f820: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f830: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
f840: 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
f850: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
f860: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
f870: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
f880: 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
f890: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
f8a0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20  Parse->nTab;    
f8b0: 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
f8c0: 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
f8d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
f8e0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b   pParse->nTab+1;
f8f0: 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
f900: 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
f910: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ndex */.  int ad
f920: 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
f930: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
f940: 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
f950: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  op */.  int tnum
f960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f970: 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
f980: 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
f990: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f9c0: 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
f9d0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
f9e0: 20 69 6e 74 20 69 73 55 6e 69 71 75 65 3b 20 20   int isUnique;  
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 75 6e  /* True for a un
fa10: 69 71 75 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  ique index */.. 
fa20: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
fa30: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
fa40: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
fa50: 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
fa60: 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  age>=0 ){.    sq
fa70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fa80: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65  , OP_MemLoad, me
fa90: 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20  mRootPage, 0);. 
faa0: 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d     tnum = 0;.  }
fab0: 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
fac0: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
fad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fae0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  dOp(v, OP_Clear,
faf0: 20 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69   tnum, pIndex->i
fb00: 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
fb10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fb20: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65  P_Integer, pInde
fb30: 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71  x->iDb, 0);.  sq
fb40: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
fb50: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
fb60: 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20  dx, tnum,.      
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
fb80: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  har*)&pIndex->ke
fb90: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
fba0: 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
fbb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
fbc0: 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c  eger, pTab->iDb,
fbd0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
fbe0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
fbf0: 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 54  enRead, iTab, pT
fc00: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c  ab->tnum);.  sql
fc10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fc20: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
fc30: 73 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e  s, iTab, pTab->n
fc40: 43 6f 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  Col);.  addr1 = 
fc50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc60: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
fc70: 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
fc80: 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
fc90: 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54  ey(v, pIndex, iT
fca0: 61 62 29 3b 0a 20 20 69 73 55 6e 69 71 75 65 20  ab);.  isUnique 
fcb0: 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
fcc0: 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71  r!=OE_None;.  sq
fcd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fce0: 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 69 49 64  , OP_IdxPut, iId
fcf0: 78 2c 20 69 73 55 6e 69 71 75 65 29 3b 0a 20 20  x, isUnique);.  
fd00: 69 66 28 20 69 73 55 6e 69 71 75 65 20 29 7b 0a  if( isUnique ){.
fd10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fd20: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
fd30: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
fd40: 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
fd50: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P3_STATIC);.  }
fd60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
fd70: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
fd80: 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a  iTab, addr1+1);.
fd90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fda0: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 31 2c 20  ngeP2(v, addr1, 
fdb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
fdc0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 73 71  ntAddr(v));.  sq
fdd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fde0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
fdf0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
fe00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
fe10: 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a  lose, iIdx, 0);.
fe20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
fe30: 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
fe40: 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
fe50: 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d  Index is the nam
fe60: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
fe70: 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73  ** and pTable is
fe80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
fe90: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
fea0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
feb0: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
fec0: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
fed0: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
fee0: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
fef0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
ff00: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
ff10: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
ff20: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
ff30: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
ff40: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
ff50: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
ff60: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
ff70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
ff80: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
ff90: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
ffa0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
ffb0: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
ffc0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
ffd0: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
ffe0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
fff0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
10000 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
10010 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
10020 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
10030 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
10040 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
10050 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
10060 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
10070 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
10080 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
10090 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
100a0 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
100b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
100c0 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
100d0 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
100e0 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
100f0 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
10100 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
10110 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
10120 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
10130 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
10140 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
10150 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
10160 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
10170 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20   *pTblName,  /* 
10180 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
10190 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
101a0 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
101b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
101c0 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
101d0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
101e0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
101f0 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f  nError,     /* O
10200 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
10210 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
10220 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
10230 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
10240 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
10250 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
10260 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
10270 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
10280 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
10290 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
102a0 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
102b0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
102c0 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
102d0 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61  *pTab = 0; /* Ta
102e0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
102f0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
10300 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65  ndex = 0; /* The
10310 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
10320 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
10330 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
10340 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
10350 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b  ullId;    /* Fak
10360 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
10370 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
10380 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
10390 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
103a0 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
103b0 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
103c0 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20    int isTemp;   
103d0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
103e0 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78   temporary index
103f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
10400 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10410 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
10420 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
10440 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
10450 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
10460 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e  pName = 0; /* Un
10470 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
10480 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
10490 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20  reate */..  if( 
104a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
104b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
104c0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
104d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
104e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
104f0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
10500 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
10510 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
10520 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
10530 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
10540 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
10550 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
10560 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
10570 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
10580 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
10590 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
105a0 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
105b0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
105c0 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
105d0 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
105e0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
105f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
10600 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
10610 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
10620 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
10630 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
10640 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
10650 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
10660 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10670 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49  index;..    /* I
10680 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
10690 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
106a0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
106b0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
106c0 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
106d0 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
106e0 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20  database to 1.. 
106f0 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d     */.    pTab =
10700 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
10710 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
10720 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  blName);.    if(
10730 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
10740 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
10750 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20  && pTab->iDb==1 
10760 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31  ){.      iDb = 1
10770 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10780 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
10790 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
107a0 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
107b0 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73  me) &&.        s
107c0 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
107d0 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
107e0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
107f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10800 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
10810 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
10820 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
10830 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  e, pTblName->a[0
10840 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
10850 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d    pTblName->a[0]
10860 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
10870 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
10880 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10890 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
108a0 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20   iDb==pTab->iDb 
108b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
108c0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
108d0 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
108e0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
108f0 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61  e;.    iDb = pTa
10900 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69  b->iDb;.  }..  i
10910 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
10920 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
10930 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10940 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
10950 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
10960 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10970 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
10980 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
10990 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
109a0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
109b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
109c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
109d0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
109e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
109f0 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
10a00 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
10a10 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
10a20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10a30 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d  ;.  }.  isTemp =
10a40 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a   pTab->iDb==1;..
10a50 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
10a60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
10a70 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
10a80 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
10a90 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
10aa0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
10ab0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
10ac0 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
10ad0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
10ae0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
10af0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
10b00 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
10b10 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
10b20 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
10b30 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
10b40 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
10b50 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
10b60 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
10b70 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
10b80 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
10b90 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
10ba0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
10bb0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
10bc0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
10bd0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
10be0 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
10bf0 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
10c00 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
10c10 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
10c20 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
10c30 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
10c40 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
10c50 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
10c60 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
10c70 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
10c80 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
10c90 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
10ca0 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20  oken(pName);.   
10cb0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10cc0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
10cd0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
10ce0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10cf0 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  ex;.    if( zNam
10d00 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
10d10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10d20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
10d30 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
10d40 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
10d50 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
10d60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10d70 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
10d80 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
10d90 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49  .busy ){.      I
10da0 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65  ndex *pISameName
10db0 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20  ;    /* Another 
10dc0 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73  index with the s
10dd0 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
10de0 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e    Table *pTSameN
10df0 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62  ame;    /* A tab
10e00 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d  le with same nam
10e10 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a  e as the index *
10e20 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  /.      if( SQLI
10e30 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
10e40 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
10e50 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
10e60 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
10e70 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65   if( (pISameName
10e80 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
10e90 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64  dex(db, zName, d
10ea0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
10eb0 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))!=0 ){.      
10ec0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10ed0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
10ee0 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
10ef0 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
10f00 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10f10 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10f20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
10f30 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pTSameName = sql
10f40 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
10f50 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
10f60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10f70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10f80 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
10f90 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
10fa0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
10fb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
10fc0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10fe0 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d  }else if( pName=
10ff0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
11000 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
11010 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
11020 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
11030 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
11040 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
11050 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
11060 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
11070 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c  intf(zBuf,"_%d",
11080 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
11090 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
110a0 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
110b0 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
110c0 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  x_", pTab->zName
110d0 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
110e0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
110f0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11100 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11110 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
11120 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
11130 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
11140 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
11150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11160 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
11170 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11180 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
11190 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
111a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
111b0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
111c0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
111d0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
111e0 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
111f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11200 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11210 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
11220 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
11230 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20  .    if( isTemp 
11240 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
11250 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
11260 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
11270 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11280 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
11290 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
112a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
112b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
112c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
112d0 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
112e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
112f0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
11300 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
11310 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
11320 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
11330 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
11340 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
11350 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
11360 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
11370 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
11380 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
11390 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
113a0 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
113b0 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
113c0 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
113d0 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
113e0 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  rlen(nullId.z);.
113f0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
11400 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
11410 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29  d(0, 0, &nullId)
11420 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
11430 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
11440 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11450 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
11460 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
11470 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
11480 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
11490 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
114a0 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
114b0 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e        (sizeof(in
114e0 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  t) + sizeof(Coll
114f0 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45  Seq*))*pList->nE
11500 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  xpr );.  if( pIn
11510 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  dex==0 ) goto ex
11520 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11530 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
11540 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
11550 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
11560 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d  ll[pList->nExpr]
11570 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
11580 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64  e = (char*)&pInd
11590 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69  ex->aiColumn[pLi
115a0 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74  st->nExpr];.  st
115b0 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rcpy(pIndex->zNa
115c0 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49  me, zName);.  pI
115d0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
115e0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
115f0 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
11600 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d  nExpr;.  pIndex-
11610 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
11620 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
11630 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
11640 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44  =0;.  pIndex->iD
11650 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  b = iDb;..  /* S
11660 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
11670 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
11680 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
11690 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
116a0 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
116b0 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
116c0 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
116d0 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
116e0 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
116f0 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
11700 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
11710 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
11720 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  xpr; i++){.    f
11730 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
11740 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
11750 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11760 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
11770 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
11780 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[j].zName)==0 
11790 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
117a0 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
117b0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
117c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
117d0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
117e0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
117f0 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
11800 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c   pTab->zName, pL
11810 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
11820 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
11830 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11840 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
11850 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
11860 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
11870 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a  ->a[i].pExpr ){.
11880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
11890 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
118a0 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >pColl );.      
118b0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
118c0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74  aColl[i] = pList
118d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43  ->a[i].pExpr->pC
118e0 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oll;.    }else{.
118f0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65        pIndex->ke
11900 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d  yInfo.aColl[i] =
11910 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70   pTab->aCol[j].p
11920 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
11930 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
11940 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
11950 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d   );.    if( !db-
11960 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20  >init.busy && . 
11970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68         sqlite3Ch
11980 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
11990 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  e, pIndex->keyIn
119a0 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20  fo.aColl[i]) .  
119b0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
119c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
119d0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  x;.    }.  }.  p
119e0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e  Index->keyInfo.n
119f0 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e  Field = pList->n
11a00 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61  Expr;..  if( pTa
11a10 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
11a20 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
11a30 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
11a40 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
11a50 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
11a60 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
11a70 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
11a80 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
11a90 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
11aa0 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
11ab0 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
11ac0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
11ad0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
11ae0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
11af0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
11b00 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
11b10 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
11b20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
11b30 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
11b40 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
11b50 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
11b60 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
11b70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
11b80 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
11b90 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
11ba0 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
11bb0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
11bc0 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
11bd0 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
11be0 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
11bf0 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
11c00 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
11c10 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
11c20 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
11c30 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
11c40 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
11c50 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
11c60 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
11c70 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
11c80 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
11c90 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
11ca0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
11cb0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
11cc0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
11cd0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
11ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11cf0 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
11d00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11d10 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
11d20 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
11d30 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
11d40 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
11d50 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
11d60 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
11d70 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
11d80 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
11d90 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
11da0 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
11db0 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
11dc0 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
11dd0 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
11de0 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  oll[k]!=pIndex->
11df0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d  keyInfo.aColl[k]
11e00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
11e10 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
11e20 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
11e30 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
11e40 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
11e50 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
11e60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
11e70 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
11e80 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
11e90 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
11ea0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
11eb0 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
11ec0 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
11ed0 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
11ee0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
11ef0 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
11f00 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
11f10 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
11f20 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
11f30 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
11f40 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
11f50 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
11f60 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
11f70 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
11f80 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
11f90 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
11fa0 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
11fb0 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
11fc0 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
11fd0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
11fe0 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
11ff0 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  our for the inde
12000 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
12010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
12020 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
12030 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
12040 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
12050 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
12060 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12070 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12080 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12090 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
120a0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
120b0 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
120c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
120d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
120e0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
120f0 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
12100 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
12110 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
12120 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
12130 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12140 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12150 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
12170 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
12180 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
12190 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
121a0 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
121b0 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
121c0 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
121d0 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
121e0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
121f0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
12200 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
12210 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
12220 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69  b[pIndex->iDb].i
12230 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12250 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
12260 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e   strlen(pIndex->
12270 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
12280 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
12290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
122a0 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
122b0 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
122c0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
122d0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
122e0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
122f0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12300 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
12310 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
12320 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
12330 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
12340 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
12350 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
12360 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
12370 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
12380 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
12390 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
123a0 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
123b0 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
123c0 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
123d0 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
123e0 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
123f0 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
12400 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
12410 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
12420 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
12430 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
12440 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
12450 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
12460 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
12470 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
12480 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
12490 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
124a0 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
124b0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
124c0 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
124d0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
124e0 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
124f0 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
12500 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
12510 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
12520 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
12530 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
12540 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
12550 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
12560 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
12570 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
12580 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
12590 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
125a0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
125b0 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
125c0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
125d0 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
125e0 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
125f0 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
12600 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
12610 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
12620 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
12630 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
12640 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
12650 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
12660 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
12670 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
12680 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
12690 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
126a0 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20  >nMem++;..    v 
126b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
126c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
126d0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
126e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
126f0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
12700 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
12710 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
12720 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
12730 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
12740 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
12750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12760 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
12770 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ateIndex, iDb, 0
12780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12790 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
127a0 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29  mStore, iMem, 0)
127b0 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
127c0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
127d0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
127e0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
127f0 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
12800 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
12810 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
12820 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b  Start && pEnd ){
12830 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
12840 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
12850 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
12860 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
12870 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
12880 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
12890 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
128a0 25 2e 2a 71 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*q",.        o
128b0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
128c0 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
128d0 2c 0a 20 20 20 20 20 20 20 20 41 64 64 72 28 70  ,.        Addr(p
128e0 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  End->z) - Addr(p
128f0 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20  Name->z) + 1,.  
12900 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
12910 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12920 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
12930 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
12940 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
12950 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
12960 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  raint */.      z
12970 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
12980 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
12990 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
129a0 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
129b0 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
129c0 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
129d0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
129e0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
129f0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
12a00 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
12a10 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c  index',%Q,%Q,#0,
12a20 27 25 73 27 29 3b 22 2c 0a 20 20 20 20 20 20 20  '%s');",.       
12a30 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
12a40 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
12a50 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
12a60 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
12a70 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
12a80 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  me,.        zStm
12a90 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
12aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12ab0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
12ac0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
12ad0 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
12ae0 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
12af0 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
12b00 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 0a 20  rse the schema. 
12b10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
12b20 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
12b30 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
12b40 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
12b50 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
12b60 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
12b70 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
12b80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12b90 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
12ba0 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
12bb0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
12bc0 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27  3MPrintf("name='
12bd0 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
12be0 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
12bf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
12c00 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
12c10 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
12c20 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
12c30 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
12c40 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
12c50 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
12c60 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
12c70 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
12c80 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
12c90 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
12ca0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
12cb0 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
12cc0 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20  ion of UPDATE.  
12cd0 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20  ** and INSERT.. 
12ce0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
12cf0 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
12d00 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
12d10 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
12d20 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
12d30 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
12d40 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
12d50 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
12d60 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
12d70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
12d80 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
12d90 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
12da0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
12db0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
12dc0 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
12dd0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
12de0 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
12df0 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
12e00 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
12e10 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
12e20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
12e30 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
12e40 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
12e50 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
12e60 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
12e70 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
12e80 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
12e90 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
12ea0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
12eb0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
12ec0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
12ed0 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
12ee0 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e  ex ){.    freeIn
12ef0 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
12f00 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
12f10 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
12f20 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
12f30 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65  tDelete(pTblName
12f40 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
12f50 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
12f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12f70 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
12f80 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
12f90 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
12fa0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
12fb0 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
12fc0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
12fd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12fe0 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
12ff0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
13000 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
13010 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
13020 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
13030 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13040 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
13050 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
13060 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
13070 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
13080 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
13090 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
130a0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
130b0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
130c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64  ) return;.  pInd
130d0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
130e0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
130f0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
13100 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
13110 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
13120 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
13130 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13140 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
13150 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
13160 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
13170 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
13180 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13190 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
131a0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
131b0 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
131c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
131d0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
131e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
131f0 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
13200 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
13210 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
13220 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
13230 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13240 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  p_index;.  }.#if
13250 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13260 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
13270 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
13280 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
13290 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
132a0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
132b0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
132c0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
132d0 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
132e0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
132f0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
13300 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e  SCHEMA_TABLE(pIn
13310 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69  dex->iDb);.    i
13320 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
13330 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
13340 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
13350 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
13360 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13370 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
13380 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
13390 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
133a0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
133b0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
133c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
133d0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
133e0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
133f0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
13400 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13410 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
13420 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13430 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13440 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
13450 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
13460 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
13470 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13480 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13490 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74  if( v ){.    int
134a0 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d 3e 69   iDb = pIndex->i
134b0 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  Db;.    sqlite3N
134c0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
134d0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
134e0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
134f0 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
13500 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
13510 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
13520 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
13530 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a    pIndex->zName.
13540 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
13550 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
13560 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
13570 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
13580 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
13590 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
135a0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
135b0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
135c0 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
135d0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
135e0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
135f0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
13600 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
13610 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
13620 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
13630 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
13640 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
13650 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
13660 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
13670 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
13680 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
13690 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
136a0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
136b0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
136c0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
136d0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
136e0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
136f0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
13700 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
13710 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
13720 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13730 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
13740 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
13750 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
13760 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
13770 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
13780 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
13790 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
137a0 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
137b0 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
137c0 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
137d0 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
137e0 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
137f0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
13800 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
13810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
13820 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
13830 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
13840 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
13850 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
13860 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
13870 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
13880 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
13890 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69 73 74  >a[0]));.  pList
138a0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
138b0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
138c0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
138d0 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e  ken);.  pList->n
138e0 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
138f0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
13900 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
13910 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
13920 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
13930 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
13940 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
13950 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
13960 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
13970 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
13980 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
13990 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
139a0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
139b0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
139c0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
139d0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
139e0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
139f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
13a00 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
13a10 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
13a20 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
13a30 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
13a40 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
13a50 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
13a60 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
13a70 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
13a80 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
13a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
13aa0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
13ab0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
13ac0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
13ad0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
13ae0 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
13af0 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
13b00 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
13b10 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
13b20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
13b30 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
13b40 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
13b50 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
13b60 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
13b70 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
13b80 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
13b90 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
13ba0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
13bb0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
13bc0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
13bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
13be0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
13bf0 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
13c00 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
13c10 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
13c20 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
13c30 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
13c40 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
13c50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
13c60 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
13c70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  end(A,B,C);.**.*
13c80 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
13c90 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
13ca0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
13cb0 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
13cc0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
13cd0 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
13ce0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
13cf0 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44  Table, Token *pD
13d00 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75  atabase){.  stru
13d10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13d20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
13d30 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
13d40 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
13d50 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  oc( sizeof(SrcLi
13d60 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
13d70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
13d80 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
13d90 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
13da0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63   if( pList->nSrc
13db0 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
13dc0 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
13dd0 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d  pNew;.    pList-
13de0 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20  >nAlloc *= 2;.  
13df0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
13e00 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20  ealloc(pList,.  
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
13e20 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
13e30 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a  List->nAlloc-1)*
13e40 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
13e50 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
13e60 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
13e70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
13e80 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
13e90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
13ea0 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
13eb0 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
13ec0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
13ed0 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d  st->nSrc];.  mem
13ee0 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
13ef0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
13f00 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
13f10 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
13f20 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
13f30 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
13f40 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
13f50 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
13f60 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
13f70 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
13f80 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
13f90 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
13fa0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
13fb0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
13fc0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
13fd0 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  n(pTable);.  pIt
13fe0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
13ff0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14000 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b  oken(pDatabase);
14010 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  .  pItem->iCurso
14020 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d  r = -1;.  pList-
14030 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
14040 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
14050 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
14060 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
14070 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
14080 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
14090 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
140a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
140b0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
140c0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
140d0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
140e0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
140f0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75   pList->a[i].iCu
14100 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  rsor<0 ){.      
14110 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  pList->a[i].iCur
14120 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
14130 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ab++;.    }.  }.
14140 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
14150 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73  alias to the las
14160 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20  t identifier on 
14170 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69  the given identi
14180 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  fier list..*/.vo
14190 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
141a0 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73  tAddAlias(SrcLis
141b0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
141c0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
141d0 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
141e0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c  nSrc>0 ){.    pL
141f0 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
14200 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73  rc-1].zAlias = s
14210 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
14220 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ken(pToken);.  }
14230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
14240 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
14250 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
14260 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
14270 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
14280 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14290 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
142a0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
142b0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
142c0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
142d0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
142e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
142f0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
14300 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
14310 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14320 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
14330 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
14340 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
14350 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
14360 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
14370 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
14380 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
14390 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
143a0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
143b0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
143c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
143d0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
143e0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
143f0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
14400 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
14410 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
14420 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
14430 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
14440 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
14450 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
14460 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
14470 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
14480 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
14490 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73  istDelete(SrcLis
144a0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
144b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
144c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
144d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
144e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
144f0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
14500 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
14510 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
14520 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
14530 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  ee(pItem->zDatab
14540 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
14550 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Free(pItem->zNam
14560 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
14570 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ee(pItem->zAlias
14580 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
14590 2d 3e 70 54 61 62 20 26 26 20 70 49 74 65 6d 2d  ->pTab && pItem-
145a0 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65  >pTab->isTransie
145b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
145c0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
145d0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
145e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
145f0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49  3SelectDelete(pI
14600 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
14610 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
14620 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29  lete(pItem->pOn)
14630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
14640 69 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  istDelete(pItem-
14650 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
14660 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
14670 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  );.}../*.** Begi
14680 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
14690 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
146a0 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
146b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
146c0 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
146d0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
146e0 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
146f0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
14700 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
14710 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
14720 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
14730 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
14740 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
14750 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
14760 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
14770 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14780 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
14790 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
147a0 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
147b0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
147c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
147d0 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
147e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
147f0 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
14800 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
14810 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
14820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14830 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61  eAddOp(v, OP_Tra
14840 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
14850 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
14860 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
14870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14880 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
14890 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  mit, 0, 0);.}../
148a0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
148b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
148c0 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54  d sqlite3CommitT
148d0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
148e0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
148f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
14900 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
14910 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
14920 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
14930 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
14940 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14950 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
14960 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
14970 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
14980 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
14990 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
149a0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
149b0 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
149c0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
149d0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
149e0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
149f0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
14a00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14a10 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
14a20 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
14a30 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
14a40 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
14a50 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
14a60 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
14a70 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
14a80 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
14a90 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
14aa0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
14ab0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
14ac0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
14ad0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
14ae0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
14af0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14b00 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
14b10 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
14b20 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14b30 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
14b40 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
14b50 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14b60 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14b70 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14b80 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
14b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ba0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
14bb0 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 1);.  }.}.
14bc0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
14bd0 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
14be0 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
14bf0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
14c00 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
14c10 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
14c20 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
14c30 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
14c40 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
14c50 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
14c60 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
14c70 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
14c80 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
14c90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
14ca0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
14cb0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
14cc0 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
14cd0 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
14ce0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14cf0 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
14d00 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
14d10 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
14d20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
14d40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14d50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
14d60 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
14d70 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
14d80 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
14d90 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
14da0 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
14db0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
14dc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
14dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14de0 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d  db->flags & !db-
14df0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
14e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14e10 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
14e20 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c  (db->aDb[1].pBt,
14e30 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
14e40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14e60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14e70 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
14e80 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
14e90 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
14ea0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
14eb0 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
14ec0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
14ed0 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  rc;.        retu
14ee0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
14ef0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14f00 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
14f10 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
14f20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
14f30 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
14f40 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20  ie and start.** 
14f50 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
14f60 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64  on for all named
14f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
14f80 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70  .**.** It is imp
14f90 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
14fa0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62  schema cookies b
14fb0 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61  e verified and a
14fc0 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73  ll.** read trans
14fd0 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74  actions be start
14fe0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  ed before anythi
14ff0 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20  ng else happens 
15000 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70  in.** the VDBE p
15010 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69  rogram.  But thi
15020 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
15030 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75   called after mu
15040 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65  ch other.** code
15050 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61   has been genera
15060 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73  ted.  So here is
15070 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a   what we do:.**.
15080 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
15090 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
150a0 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64  s called, we cod
150b0 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61  e an OP_Goto tha
150c0 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74  t.** will jump t
150d0 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61  o a subroutine a
150e0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
150f0 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20   program.  Then 
15100 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65  we.** record eve
15110 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
15120 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d   needs its schem
15130 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68  a verified in th
15140 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e.** pParse->coo
15150 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20  kieMask field.  
15160 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c  Later, after all
15170 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
15180 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65  been.** generate
15190 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  d, the subroutin
151a0 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20  e that does the 
151b0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
151c0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72  ions and.** star
151d0 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
151e0 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65  ons will be code
151f0 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74  d and the OP_Got
15200 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69  o P2 value.** wi
15210 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f  ll be made to po
15220 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72  int to that subr
15230 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e  outine.  The gen
15240 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  eration of the.*
15250 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  * cookie verific
15260 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  ation subroutine
15270 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e   code happens in
15280 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
15290 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ding()..**.** If
152a0 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65   iDb<0 then code
152b0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c   the OP_Goto onl
152c0 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c  y - don't set fl
152d0 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  ag to verify the
152e0 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e  .** schema on an
152f0 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54 68  y databases.  Th
15300 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
15310 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f  o position the O
15320 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20  P_Goto.** early 
15330 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66  in the code, bef
15340 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61  ore we know if a
15350 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ny database tabl
15360 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  es will be used.
15370 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15380 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
15390 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
153a0 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
153b0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
153c0 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  *v;.  int mask;.
153d0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
153e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
153f0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
15400 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
15410 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
15420 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
15430 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70  rror */.  db = p
15440 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
15450 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
15460 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  oto==0 ){.    pP
15470 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
15480 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15490 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
154a0 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
154b0 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
154c0 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
154d0 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
154e0 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
154f0 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
15500 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
15510 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d   iDb<32 );.    m
15520 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
15530 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
15540 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
15550 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
15560 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
15570 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
15580 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
15590 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
155a0 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
155b0 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28  ookie;.      if(
155c0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
155d0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
155e0 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73  mpDatabase(pPars
155f0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
15600 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
15610 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
15620 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
15630 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
15640 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
15650 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
15660 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
15670 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
15680 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
15690 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
156a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
156b0 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
156c0 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
156d0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
156e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
156f0 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
15700 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
15710 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
15720 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
15730 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
15740 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
15750 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
15760 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
15770 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
15780 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
15790 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
157a0 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
157b0 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
157c0 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
157d0 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
157e0 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
157f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
15800 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
15810 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
15820 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
15830 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
15840 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
15850 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15860 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
15870 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
15880 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
15890 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
158a0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
158b0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61  .**.** Only data
158c0 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65  base iDb and the
158d0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
158e0 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
158f0 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a   by this call..*
15900 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65  * If iDb==0, the
15910 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74  n the main and t
15920 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72  emp databases ar
15930 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
15940 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20     If.** iDb==1 
15950 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65  then only the te
15960 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  mp database is m
15970 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49  ade writable.  I
15980 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65  f iDb>1 then the
15990 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75  .** specified au
159a0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
159b0 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
159c0 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
159d0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  writable..*/.voi
159e0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
159f0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
15a00 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15a10 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
15a20 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
15a30 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15a40 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15a50 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
15a60 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
15a70 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
15a80 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73  e, iDb);.  pPars
15a90 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  e->writeMask |= 
15aa0 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65  1<<iDb;.  if( se
15ab0 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50  tStatement && pP
15ac0 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
15ad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
15ae0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
15af0 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29  atement, iDb, 0)
15b00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 21  ;.  }.  if( iDb!
15b10 3d 31 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  =1 && pParse->db
15b20 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20  ->aDb[1].pBt!=0 
15b30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
15b40 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
15b50 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
15b60 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
15b70 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  }../* .** Return
15b80 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 73   the transient s
15b90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
15ba0 65 63 74 20 75 73 65 64 20 66 6f 72 20 65 6e 63  ect used for enc
15bb0 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e  oding conversion
15bc0 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 20  s.** during SQL 
15bd0 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  compilation..*/.
15be0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
15bf0 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65  qlite3GetTransie
15c00 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 20  ntValue(sqlite3 
15c10 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d  *db){.  if( !db-
15c20 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64  >pValue ){.    d
15c30 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69  b->pValue = sqli
15c40 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
15c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
15c60 70 56 61 6c 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pValue;.}../*.**
15c70 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
15c80 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
15c90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
15ca0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
15cb0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
15cc0 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
15cd0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
15ce0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15cf0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
15d00 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
15d10 69 6f 6e 4d 61 74 63 68 28 43 6f 6c 6c 53 65 71  ionMatch(CollSeq
15d20 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *pColl, Index *
15d30 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 6e  pIndex){.  int n
15d40 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e   = pIndex->keyIn
15d50 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20 20 43 6f 6c  fo.nField;.  Col
15d60 6c 53 65 71 20 2a 2a 70 70 20 3d 20 70 49 6e 64  lSeq **pp = pInd
15d70 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
15d80 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  l;.  while( n-- 
15d90 29 7b 0a 20 20 20 20 69 66 28 20 2a 70 70 3d 3d  ){.    if( *pp==
15da0 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20 31  pColl ) return 1
15db0 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a  ;.    pp++;.  }.
15dc0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
15dd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
15de0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
15df0 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75  s of pTab that u
15e00 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
15e10 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
15e20 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  .** If pColl==0 
15e30 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61  then recompute a
15e40 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
15e50 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ab..*/.#ifndef S
15e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
15e70 45 58 0a 76 6f 69 64 20 72 65 69 6e 64 65 78 54  EX.void reindexT
15e80 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
15e90 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
15ea0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
15eb0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
15ec0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
15ed0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
15ee0 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
15ef0 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
15f00 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
15f10 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
15f20 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
15f30 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
15f40 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
15f50 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20  h(pColl,pIndex) 
15f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15f70 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
15f80 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
15f90 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  Tab->iDb);.     
15fa0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
15fb0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
15fc0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ex, -1);.    }. 
15fd0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
15fe0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
15ff0 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
16000 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
16010 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
16020 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
16030 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
16040 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
16050 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
16060 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
16070 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
16080 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
16090 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
160a0 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e 64 65  NDEX.void reinde
160b0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
160c0 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65   *pParse, CollSe
160d0 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44 62 20  q *pColl){.  Db 
160e0 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
160f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
16100 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
16110 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16130 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
16140 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
16150 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16160 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
16170 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
16180 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73  nection */.  Has
16190 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
161a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
161b0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
161c0 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
161d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
161e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
161f0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
16200 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72  tabase */..  for
16210 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
16220 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
16230 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
16240 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d 30 20  .    if( pDb==0 
16250 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16260 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
16270 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62  shFirst(&pDb->tb
16280 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
16290 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
162a0 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
162b0 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
162c0 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
162d0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
162e0 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c  rse, pTab, pColl
162f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
16300 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
16310 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
16320 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
16330 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  .  If the argume
16340 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 74  nt is present it
16350 0a 2a 2a 20 69 73 20 74 68 65 20 6e 61 6d 65 20  .** is the name 
16360 6f 66 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  of a collating s
16370 65 71 75 65 6e 63 65 20 61 6e 64 20 61 6c 6c 20  equence and all 
16380 69 6e 64 69 63 65 73 20 74 68 61 74 20 75 73 65  indices that use
16390 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 6c 61 74 69   that.** collati
163a0 6e 67 20 73 65 71 75 65 6e 63 65 20 73 68 6f 75  ng sequence shou
163b0 6c 64 20 62 65 20 72 65 69 6e 64 65 78 65 64 2e  ld be reindexed.
163c0 20 20 49 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74    If no argument
163d0 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20   is present,.** 
163e0 74 68 65 6e 20 72 65 62 75 69 6c 64 20 61 6c 6c  then rebuild all
163f0 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 23 69 66 6e   indices.*/.#ifn
16400 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16410 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
16420 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
16430 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
16440 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
16450 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
16460 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
16470 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
16480 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
16490 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
164a0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
164b0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
164c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
164d0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
164e0 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
164f0 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
16500 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16510 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
16520 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16540 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
16550 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
16560 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
16570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16580 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16590 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
165a0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
165b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
165c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
165d0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
165e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
165f0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
16600 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16610 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
16620 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
16630 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16640 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
16650 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
16660 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4e  xed */..  if( pN
16670 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
16680 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
16690 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
166a0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
166b0 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 29 7b  if( pName2==0 ){
166c0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
166d0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
166e0 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61  db, db->enc, pNa
166f0 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e  me1->z, pName1->
16700 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  n, 0);.    if( p
16710 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
16720 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
16730 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20  Parse, pColl);. 
16740 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
16750 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73   }.  }.  iDb = s
16760 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
16770 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
16780 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
16790 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
167a0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
167b0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
167c0 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29  mToken(pObjName)
167d0 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
167e0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
167f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
16800 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
16810 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
16820 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
16830 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
16840 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
16850 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74  Free(z);.    ret
16860 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
16870 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
16880 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
16890 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
168a0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
168b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
168c0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
168d0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
168e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
168f0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
16900 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
16910 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
16920 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16930 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
16940 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
16950 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
16960 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
16970 64 69 66 0a                                      dif.