/ Hex Artifact Content
Login

Artifact 6bf007d0da0527820329d5695c90e1042bef1e58:


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 33 36 35 20 32 30 30 36 2f 30 31 2f 30 34  1.365 2006/01/04
02f0: 20 31 35 3a 35 34 3a 33 36 20 64 72 68 20 45 78   15:54:36 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 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
05e0: 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
05f0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
0600: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
0610: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0620: 28 20 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ( !pParse->pVdbe
0630: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
0640: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
0650: 4b 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  K && pParse->nEr
0660: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  r ){.      pPars
0670: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
0680: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
0690: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
06a0: 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72  * Begin by gener
06b0: 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69  ating some termi
06c0: 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74  nation code at t
06d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
06e0: 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a  ** vdbe program.
06f0: 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
0700: 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71  se->db;.  v = sq
0710: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0720: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
0730: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0740: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74  AddOp(v, OP_Halt
0750: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
0760: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
0770: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
0780: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
0790: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
07a0: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
07b0: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
07c0: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
07d0: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
07e0: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
07f0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
0800: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
0810: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
0820: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
0830: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
0840: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0850: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
0860: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
0870: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
0880: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
0890: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
08a0: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
08b0: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
08c0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
08d0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
08e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
08f0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
0900: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
0910: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
0920: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
0930: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
0940: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
0950: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
0960: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
0970: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
0980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0990: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
09a0: 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73  ction, iDb, (mas
09b0: 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74  k & pParse->writ
09c0: 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20  eMask)!=0);.    
09d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
09e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
09f0: 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50  yCookie, iDb, pP
0a00: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
0a10: 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d  e[iDb]);.      }
0a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
0a30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
0a40: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63  to, 0, pParse->c
0a50: 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20  ookieGoto);.    
0a60: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
0a70: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
0a80: 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20   /* Add a No-op 
0a90: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
0aa0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
0ab0: 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  of the compiled 
0ac0: 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  SQL.    ** state
0ad0: 6d 65 6e 74 20 61 73 20 69 74 73 20 50 33 20 61  ment as its P3 a
0ae0: 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64  rgument.  This d
0af0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
0b00: 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  he functionality
0b10: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
0b20: 72 6f 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a  rogram. .    **.
0b30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
0b40: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
0b50: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29   sqlite3_trace()
0b60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
0b70: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
0b80: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50  P_Noop, 0, 0, pP
0b90: 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72  arse->zSql, pPar
0ba0: 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65  se->zTail-pParse
0bb0: 2d 3e 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66 20  ->zSql);.#endif 
0bc0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
0bd0: 52 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20  RACE */.  }...  
0be0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
0bf0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
0c00: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
0c10: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
0c20: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
0c30: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
0c40: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
0c50: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
0c60: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
0c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0c80: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
0c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0ca0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
0cb0: 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73  rse->nVar, pPars
0cc0: 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20  e->nMem+3,.     
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
0cf0: 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  +3, pParse->expl
0d00: 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ain);.    pParse
0d10: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
0d20: 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  NE;.    pParse->
0d30: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b  colNamesSet = 0;
0d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
0d50: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
0d60: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  OK ){.    pParse
0d70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0d80: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ROR;.  }.  pPars
0d90: 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70  e->nTab = 0;.  p
0da0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  Parse->nMem = 0;
0db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20  .  pParse->nSet 
0dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0dd0: 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Var = 0;.  pPars
0de0: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20  e->cookieMask = 
0df0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
0e00: 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a  kieGoto = 0;.}..
0e10: 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61  /*.** Run the pa
0e20: 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65  rser and code ge
0e30: 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76  nerator recursiv
0e40: 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ely in order to 
0e50: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65  generate.** code
0e60: 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61   for the SQL sta
0e70: 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74  tement given ont
0e80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
0e90: 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a   pParse context.
0ea0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
0eb0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
0ec0: 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65    When the parse
0ed0: 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69  r is run recursi
0ee0: 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79  vely.** this way
0ef0: 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48  , the final OP_H
0f00: 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e  alt is not appen
0f10: 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e  ded and other in
0f20: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20  itialization.** 
0f30: 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  and finalization
0f40: 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74   steps are omitt
0f50: 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65  ed because those
0f60: 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79   are handling by
0f70: 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73   the.** outermos
0f80: 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20  t parser..**.** 
0f90: 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69  Not everything i
0fa0: 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69  s nestable.  Thi
0fb0: 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65  s facility is de
0fc0: 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74  signed to permit
0fd0: 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41  .** INSERT, UPDA
0fe0: 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f  TE, and DELETE o
0ff0: 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73  perations agains
1000: 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e  t SQLITE_MASTER.
1010: 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66    Use.** care if
1020: 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74   you decide to t
1030: 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72  ry to use this r
1040: 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20  outine for some 
1050: 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a  other purposes..
1060: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e  */.void sqlite3N
1070: 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65  estedParse(Parse
1080: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1090: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
10a0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
10b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
10c0: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
10d0: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
10e0: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
10f0: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1100: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1110: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1120: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1130: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1140: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1150: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1160: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1170: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1180: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1190: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
11a0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
11b0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
11c0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
11d0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
11e0: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
11f0: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
1200: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
1210: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1220: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
1230: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
1240: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
1250: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
1260: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
1270: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
1280: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
1290: 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Sql, 0);.  sqlit
12a0: 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d  eFree(zSql);.  m
12b0: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
12c0: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
12d0: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
12e0: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
12f0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1300: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1310: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1320: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1330: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1340: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
1350: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
1360: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
1370: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1380: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
1390: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
13a0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
13b0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
13c0: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
13d0: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
13e0: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
13f0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
1400: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
1410: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
1420: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
1430: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
1440: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
1450: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
1460: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
1470: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
1480: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
1490: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
14a0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
14b0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
14c0: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
14d0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
14e0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
14f0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
1500: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
1510: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1520: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
1530: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
1540: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
1550: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
1560: 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30  assert( zName!=0
1570: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64   );.  assert( (d
1580: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1590: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c  E_Initialized) |
15a0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
15b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
15c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
15d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
15e0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
15f0: 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63   : i;   /* Searc
1600: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
1610: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
1620: 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71  atabase!=0 && sq
1630: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61  lite3StrICmp(zDa
1640: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
1650: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
1660: 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71  inue;.    p = sq
1670: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
1680: 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73  b->aDb[j].tblHas
1690: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
16a0: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
16b0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
16c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
16d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
16e0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
16f0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1700: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
1710: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
1720: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
1730: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
1740: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
1750: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
1760: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
1770: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
1780: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
1790: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
17a0: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
17b0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
17c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
17d0: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
17e0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
17f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
1800: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
1810: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
1820: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
1830: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
1840: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
1850: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
1860: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1870: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
1880: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
1890: 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65  ocateTable(Parse
18a0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
18b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
18c0: 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29  st char *zDbase)
18d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20  {.  Table *p;.. 
18e0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
18f0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
1900: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1910: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1920: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
1930: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
1940: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
1950: 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
1960: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1970: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1980: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1990: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
19a0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
19b0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
19c0: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
19d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
19e0: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
19f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a00: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1a10: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
1a20: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
1a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a50: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a60: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
1a70: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
1a80: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1a90: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
1aa0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1ab0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1ac0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1ad0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1ae0: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1af0: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
1b00: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
1b10: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
1b20: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1b30: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
1b40: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
1b50: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1b60: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1b70: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
1b80: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
1b90: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
1ba0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
1bb0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
1bc0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
1bd0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1be0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
1bf0: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
1c00: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
1c10: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
1c20: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
1c30: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
1c40: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
1c50: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
1c60: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
1c70: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
1c80: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
1c90: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
1ca0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1cb0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1cc0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
1cd0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ;.  assert( (db-
1cf0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1d00: 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20  Initialized) || 
1d10: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
1d20: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
1d30: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
1d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1d50: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
1d60: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
1d70: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
1d80: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  */.    if( zDb &
1d90: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1da0: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
1db0: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
1dc0: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
1dd0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
1de0: 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c  >aDb[j].idxHash,
1df0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
1e00: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66  Name)+1);.    if
1e10: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
1e20: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1e30: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68  /*.** Reclaim th
1e40: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  e memory used by
1e50: 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61   an index.*/.sta
1e60: 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64  tic void freeInd
1e70: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
1e80: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43  sqliteFree(p->zC
1e90: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
1ea0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
1eb0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
1ec0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
1ed0: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
1ee0: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
1ef0: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
1f00: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
1f10: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
1f20: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1f30: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ase hash tables 
1f40: 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  but.** it is not
1f50: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
1f60: 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74  he Table that it
1f70: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c   indexes..** Unl
1f80: 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  inking from the 
1f90: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f  Table must be do
1fa0: 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ne by the callin
1fb0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
1fc0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1fd0: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  eDeleteIndex(sql
1fe0: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
1ff0: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
2000: 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  ld;..  assert( d
2010: 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65  b!=0 && p->zName
2020: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
2030: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2040: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
2050: 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a  b].idxHash, p->z
2060: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
2090: 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  +1, 0);.  assert
20a0: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
20b0: 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e  d==p );.  freeIn
20c0: 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dex(p);.}../*.**
20d0: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
20e0: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
20f0: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
2100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
2110: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
2120: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
2130: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
2140: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
2150: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
2160: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
2170: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
2180: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
2190: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
21a0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
21b0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
21c0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
21d0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
21e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
21f0: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
2200: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
2210: 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72  en;..  len = str
2220: 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  len(zIdxName);. 
2230: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
2240: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
2250: 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61 73  >aDb[iDb].idxHas
2260: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e  h, zIdxName, len
2270: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  +1, 0);.  if( pI
2280: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2290: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
22a0: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
22b0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
22c0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
22d0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
22e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22f0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2300: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2310: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2320: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
2330: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
2340: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
2350: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
2360: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
2370: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
2380: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2390: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
23a0: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
23b0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
23c0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
23d0: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
23e0: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
23f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2400: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
2410: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
2420: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
2430: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
2440: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
2450: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
2460: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
2470: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
2480: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
2490: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
24a0: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
24b0: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
24c0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
24d0: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
24e0: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
24f0: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
2500: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
2510: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
2520: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
2530: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
2540: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
2550: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
2560: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
2570: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
2580: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
2590: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
25a0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
25b0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
25c0: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
25d0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
25e0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
25f0: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
2600: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
2610: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
2620: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
2630: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
2640: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2650: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
2660: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
2670: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2680: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
2690: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
26a0: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
26b0: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
26c0: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
26d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
26e0: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
26f0: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2700: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
2710: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2720: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
2730: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
2740: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
2750: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
2760: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2770: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
2780: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2790: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
27a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
27b0: 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72 69  leteTrigger((Tri
27c0: 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73 68  gger*)sqliteHash
27d0: 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20  Data(pElem));.  
27e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
27f0: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
2800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
2810: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
2820: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2830: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
2840: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2850: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
2860: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
2870: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2880: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
2890: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
28a0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
28b0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
28c0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
28d0: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
28e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
28f0: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
2900: 70 44 62 2d 3e 70 53 65 71 54 61 62 20 3d 20 30  pDb->pSeqTab = 0
2910: 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  ;.    DbClearPro
2920: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
2930: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
2940: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
2950: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
2960: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
2970: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2980: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2990: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
29a0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
29b0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
29c0: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
29d0: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
29e0: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e  then remove then
29f0: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
2a00: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
2a10: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
2a20: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
2a30: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
2a40: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
2a50: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
2a60: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
2a70: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
2a80: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
2a90: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
2aa0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
2ab0: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
2ac0: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2ad0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
2ae0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
2af0: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
2b00: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
2b10: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
2b20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
2b30: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
2b40: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
2b50: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
2b60: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
2b70: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
2b80: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
2b90: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2ba0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
2bb0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2bc0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
2bd0: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
2be0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
2bf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
2c00: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
2c10: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
2c30: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
2c40: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
2c50: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
2c60: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
2c70: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
2c80: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
2c90: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
2ca0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
2cb0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
2cc0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
2cd0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
2ce0: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
2cf0: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
2d00: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
2d10: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
2d20: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
2d30: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
2d40: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
2d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2d60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2d70: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
2d80: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
2d90: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
2da0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
2db0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
2dc0: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
2dd0: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
2de0: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2df0: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
2e00: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
2e10: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
2e20: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
2e30: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
2e40: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
2e50: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2e60: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
2e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
2e80: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2e90: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
2ea0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2eb0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2ec0: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
2ed0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2ee0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
2ef0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
2f00: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
2f10: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
2f20: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2f30: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
2f40: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
2f50: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
2f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f70: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
2f80: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
2f90: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
2fa0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
2fb0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
2fc0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
2fd0: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
2fe0: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
2ff0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
3000: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
3010: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3020: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  eFree(pCol->zNam
3030: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3040: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
3050: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
3060: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
3070: 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20  >zType);.    }. 
3080: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
3090: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
30a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
30b0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
30c0: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
30d0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
30e0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
30f0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3100: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3110: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3120: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3130: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3140: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3150: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3160: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3170: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3180: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3190: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
31a0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
31b0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
31c0: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
31d0: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
31e0: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
31f0: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3200: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3210: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3220: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3230: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3240: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3250: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3260: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
3270: 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f  .** Indices asso
3280: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3290: 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b  table are unlink
32a0: 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22  ed from the "db"
32b0: 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75  .** data structu
32c0: 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20  re if db!=NULL. 
32d0: 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e   If db==NULL, in
32e0: 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74  dices attached t
32f0: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61  o.** the table a
3300: 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20  re deleted, but 
3310: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
3320: 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ey have already 
3330: 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64  been.** unlinked
3340: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3350: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
3360: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
3370: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
3380: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3390: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
33a0: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20  , *pNextFKey;.. 
33b0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
33c0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44   return;..  /* D
33d0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
33e0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
33f0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3400: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
3410: 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  /.  pTable->nRef
3420: 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  --;.  if( pTable
3430: 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
3440: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3450: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52  sert( pTable->nR
3460: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  ef==0 );..  /* D
3470: 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  elete all indice
3480: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3490: 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a  h this table.  *
34a0: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
34b0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
34c0: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
34d0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
34e0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
34f0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
3500: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62  Index->iDb==pTab
3510: 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62  le->iDb || (pTab
3520: 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49  le->iDb==0 && pI
3530: 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b  ndex->iDb==1) );
3540: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
3550: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3560: 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  x);.  }..#ifndef
3570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
3580: 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65  EIGN_KEY.  /* De
3590: 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e  lete all foreign
35a0: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
35b0: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
35c0: 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a  .  The keys.  **
35d0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
35e0: 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b  eady been unlink
35f0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  ed from the db->
3600: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3610: 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b   .  */.  for(pFK
3620: 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79  ey=pTable->pFKey
3630: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
3640: 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70  NextFKey){.    p
3650: 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79  NextFKey = pFKey
3660: 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20  ->pNextFrom;.   
3670: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
3680: 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  >iDb<db->nDb );.
3690: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
36a0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
36b0: 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62  >aDb[pTable->iDb
36c0: 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20  ].aFKey,.       
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
36f0: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
3700: 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a  o)+1)!=pFKey );.
3710: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3720: 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  FKey);.  }.#endi
3730: 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  f..  /* Delete t
3740: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
3750: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
3760: 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c    sqliteResetCol
3770: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29  umnNames(pTable)
3780: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
3790: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
37a0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
37b0: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
37c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
37d0: 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  ete(pTable->pSel
37e0: 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ect);.#ifndef SQ
37f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
3800: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3810: 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68 65  ete(pTable->pChe
3820: 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  ck);.#endif.  sq
3830: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
3840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
3850: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
3860: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3870: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
3880: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
3890: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
38a0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
38b0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
38c0: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
38d0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
38e0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
38f0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3900: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
3910: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
3920: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
3930: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
3940: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
3960: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
3970: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
3980: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
3990: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
39a0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
39b0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
39c0: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
39d0: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
39e0: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61  e, strlen(zTabNa
39f0: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
3a00: 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   p ){.#ifndef SQ
3a10: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3a20: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
3a30: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
3a40: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
3a50: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
3a60: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
3a70: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
3a80: 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48    pF2 = sqlite3H
3a90: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46  ashFind(&pDb->aF
3aa0: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
3ab0: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
3ac0: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
3ad0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
3ae0: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
3af0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
3b00: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
3b10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3b20: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
3b30: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
3b40: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
3b50: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
3b60: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
3b70: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
3b80: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
3b90: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
3ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
3bb0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
3bc0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3bd0: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
3be0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3bf0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3c00: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
3c10: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
3c20: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
3c30: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
3c40: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
3c50: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
3c60: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
3c70: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
3c80: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3c90: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
3ca0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3cb0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
3cc0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3cd0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
3ce0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
3cf0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
3d00: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
3d10: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
3d20: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
3d30: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
3d40: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
3d50: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
3d60: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3d70: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
3d80: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
3d90: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
3da0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
3db0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
3dc0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
3dd0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
3de0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
3df0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
3e00: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
3e10: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
3e20: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3e30: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3e40: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
3e50: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3e60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
3e70: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
3e80: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
3e90: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
3ea0: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
3eb0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
3ec0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
3ed0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
3ee0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
3ef0: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
3f00: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
3f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3f20: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
3f30: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3f40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
3f50: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
3f60: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
3f70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3f80: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
3f90: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
3fa0: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
3fb0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
3fc0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
3fd0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
3fe0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
3ff0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4000: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4010: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4020: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4030: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4040: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4050: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4060: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4070: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4080: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4090: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
40a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
40b0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
40c0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
40d0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
40e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
40f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
4100: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
4110: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
4120: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
4130: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4140: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4150: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4160: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4170: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
4180: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
4190: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
41a0: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
41b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
41c0: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
41d0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
41e0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e     n = strlen(zN
41f0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
4200: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
4210: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
4220: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
4230: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4240: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4250: 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28   ) && n==strlen(
4260: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
4270: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
4280: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
4290: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
42a0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
42b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
42c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
42d0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
42e0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
42f0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
4300: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
4310: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
4320: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
4330: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4340: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4350: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4360: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4370: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4380: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4390: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
43a0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
43b0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
43c0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
43d0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
43e0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
43f0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
4400: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
4410: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
4420: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
4430: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4440: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4450: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4460: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4470: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4480: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
4490: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
44a0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
44b0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
44c0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
44d0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
44e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
44f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
4500: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
4510: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
4520: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
4530: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4540: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4550: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4560: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4570: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4580: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
4590: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
45a0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
45b0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
45c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
45d0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
45e0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
45f0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
4600: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
4610: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
4620: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
4630: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
4640: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4660: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
4670: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
4680: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4690: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
46a0: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
46b0: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
46c0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
46d0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
46e0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
46f0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
4700: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
4710: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
4720: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
4730: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4740: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
4750: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
4760: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
4770: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4780: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4790: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
47a0: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
47b0: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
47c0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
47d0: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
47e0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
47f0: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
4800: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
4810: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4820: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
4830: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
4840: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
4850: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
4860: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
4870: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
4880: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
4890: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
48a0: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
48b0: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
48c0: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
48d0: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
48e0: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
48f0: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
4900: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
4910: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
4920: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
4930: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
4940: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
4950: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
4960: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
4970: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
4980: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4990: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
49a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
49b0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
49c0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
49d0: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
49e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
49f0: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
4a00: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
4a10: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
4a20: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
4a30: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4a40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4a50: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
4a60: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4a70: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
4a80: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4a90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4ab0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4ac0: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
4ad0: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
4ae0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
4af0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
4b00: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
4b10: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
4b20: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
4b30: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
4b40: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
4b50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4b60: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
4b70: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
4b80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
4b90: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
4ba0: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
4bb0: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
4bc0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4bd0: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
4be0: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
4bf0: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
4c00: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4c10: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
4c20: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
4c30: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
4c40: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
4c50: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
4c60: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
4c70: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
4c80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
4c90: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
4ca0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
4cb0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
4cc0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
4cd0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
4ce0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
4cf0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
4d00: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
4d10: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
4d20: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
4d30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4d40: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
4d50: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4d60: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
4d70: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
4d80: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
4d90: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
4da0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
4db0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
4dc0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
4dd0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4de0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4df0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
4e00: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
4e10: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
4e20: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
4e30: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
4e40: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4e50: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
4e60: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
4e70: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
4e80: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
4e90: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4ea0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
4eb0: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
4ec0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
4ed0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
4ee0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
4ef0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4f00: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
4f10: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
4f20: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
4f30: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
4f40: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4f50: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
4f60: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
4f70: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
4f80: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4f90: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
4fa0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
4fb0: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
4fc0: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
4fd0: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
4fe0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
4ff0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
5000: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
5010: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
5020: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
5030: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
5040: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5050: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
5060: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
5070: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5080: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
5090: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
50a0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
50b0: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
50c0: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
50d0: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
50e0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
50f0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
5100: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
5110: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5120: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5130: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
5140: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
5150: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
5160: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5170: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
5180: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5190: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
51a0: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
51b0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
51c0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
51d0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
51e0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
51f0: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
5200: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5210: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5220: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
5230: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5240: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
5250: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5260: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5270: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
5280: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
5290: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
52a0: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
52b0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
52c0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
52d0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
52e0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
52f0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5300: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
5310: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
5320: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
5330: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
5340: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5350: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
5360: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
5370: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
5380: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
5390: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
53a0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
53b0: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
53c0: 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f  rn;.  if( !OMIT_
53d0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
53e0: 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   && iDb>1 ){.   
53f0: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
5400: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
5410: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
5420: 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20  e qualified */. 
5430: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5440: 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70  sg(pParse, "temp
5450: 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  orary table name
5460: 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69   must be unquali
5470: 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  fied");.    retu
5480: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f  rn;.  }.  if( !O
5490: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
54a0: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
54b0: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
54c0: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
54d0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
54e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
54f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
5500: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
5510: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5520: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
5530: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
5540: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
5550: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5560: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5570: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
5580: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
5590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
55a0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
55b0: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
55c0: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
55d0: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
55e0: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
55f0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
5600: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
5610: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5620: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
5630: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
5640: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
5650: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
5660: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5670: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
5680: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
5690: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
56a0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
56b0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
56c0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
56d0: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
56e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
56f0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5700: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
5710: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5720: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
5730: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5740: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5750: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5760: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
5770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5780: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5790: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
57a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
57b0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
57c0: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
57d0: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
57e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
57f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
5810: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
5820: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
5830: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
5840: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
5850: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
5860: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
5870: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
5880: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
5890: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
58a0: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20  .  ** it does.. 
58b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
58c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
58d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
58e0: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
58f0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5900: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
5910: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
5920: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
5930: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
5940: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
5950: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
5960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5970: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5980: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
5990: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
59a0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
59b0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
59c0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  r;.  }.  if( sql
59d0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
59e0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26  , zName, 0)!=0 &
59f0: 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62  & (iDb==0 || !db
5a00: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
5a10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5a20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
5a30: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
5a40: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
5a50: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  , zName);.    go
5a60: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5a70: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
5a80: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
5a90: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
5aa0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
5ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
5ac0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
5ad0: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
5ae0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
5af0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5b00: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
5b10: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
5b20: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
5b30: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
5b40: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
5b50: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
5b60: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
5b70: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
5b80: 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 70 54  >iDb = iDb;.  pT
5b90: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
5ba0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
5bb0: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
5bc0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
5bd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5be0: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
5bf0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
5c00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
5c10: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
5c20: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
5c30: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
5c40: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
5c50: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
5c60: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
5c70: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
5c80: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
5c90: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
5ca0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
5cb0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
5cc0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5cd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
5ce0: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
5cf0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
5d00: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
5d10: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
5d20: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
5d30: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61  >aDb[iDb].pSeqTa
5d40: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
5d50: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
5d60: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
5d70: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5d80: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
5d90: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
5da0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
5db0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
5dc0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
5dd0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
5de0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
5df0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
5e00: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
5e10: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
5e20: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
5e30: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
5e40: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
5e50: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
5e60: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
5e70: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
5e80: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
5e90: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
5ea0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
5eb0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
5ec0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
5ed0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
5ee0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5ef0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
5f00: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
5f10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
5f20: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
5f30: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5f40: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
5f50: 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20  {.    int lbl;. 
5f60: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
5f70: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5f80: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
5f90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
5fa0: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
5fb0: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
5fc0: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
5fd0: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
5fe0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
5ff0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
6000: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6010: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
6020: 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65  b, 1);   /* file
6030: 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c  _format */.    l
6040: 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  bl = sqlite3Vdbe
6050: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6070: 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20  Op(v, OP_If, 0, 
6080: 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lbl);.    sqlite
6090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60a0: 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c 49 54 45  _Integer, SQLITE
60b0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f  _DEFAULT_FILE_FO
60c0: 52 4d 41 54 2c 20 30 29 3b 0a 20 20 20 20 73 71  RMAT, 0);.    sq
60d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
60e0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
60f0: 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  iDb, 1);.    sql
6100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6110: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6120: 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  >enc, 0);.    sq
6130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6140: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6150: 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c  iDb, 4);.    sql
6160: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6170: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20  abel(v, lbl);.. 
6180: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
6190: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
61a0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
61b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
61c0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
61d0: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
61e0: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
61f0: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
6200: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
6210: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
6220: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
6230: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
6240: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
6250: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
6260: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
6270: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
6280: 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  ry is left on th
6290: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
62a0: 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ck..    ** The r
62b0: 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65  owid value is ne
62c0: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
62d0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64   that sqlite3End
62e0: 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a  Table will.    *
62f0: 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  * generate..    
6300: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6310: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
6320: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
6330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6340: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6350: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
6360: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
6370: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6380: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6390: 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c  reateTable, iDb,
63a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
63b0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
63c0: 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20  Table(v, iDb);. 
63d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
63e0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
63f0: 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  id, 0, 0);.    s
6400: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6410: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
6420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
6440: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  l, 0, 0);.    sq
6450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6460: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
6470: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6480: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6490: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
64a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64b0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
64c0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e   0);.  }..  /* N
64d0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
64e0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
64f0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
6500: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
6510: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
6520: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
6530: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  or:.  sqliteFree
6540: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
6550: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
6560: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
6570: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
6580: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
6590: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
65a0: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
65b0: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
65c0: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
65d0: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
65e0: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
65f0: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
6600: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
6610: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
6620: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
6630: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
6640: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
6650: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
6660: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
6670: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
6680: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
6690: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
66a0: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
66b0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
66c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
66d0: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
66e0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
66f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
6700: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
6710: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
6720: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
6730: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
6740: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
6750: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
6760: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
6770: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
6780: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
6790: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
67a0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
67b0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
67c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
67d0: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
67e0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
67f0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
6800: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
6810: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
6820: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
6830: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
6840: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6850: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
6860: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6870: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
6880: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6890: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
68a0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
68b0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
68c0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
68d0: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
68e0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
68f0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
6900: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
6910: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
6920: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
6930: 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61   STRICMP(z, p->a
6940: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b  Col[i].zName) ){
6950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6960: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6970: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
6980: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
6990: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
69a0: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
69b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
69c0: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
69d0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
69e0: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
69f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
6a00: 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70  loc( p->aCol, (p
6a10: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
6a20: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
6a30: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
6a40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
6a50: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  ee(z);.      ret
6a60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
6a70: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
6a80: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
6a90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
6aa0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
6ab0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
6ac0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
6ad0: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
6ae0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
6af0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
6b00: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
6b10: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
6b20: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
6b30: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
6b40: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
6b50: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
6b60: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
6b70: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
6b80: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
6b90: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
6ba0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
6bb0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
6bc0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f  _AFF_NONE;.  pCo
6bd0: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
6be0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
6bf0: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
6c00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6c10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
6c20: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
6c30: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
6c40: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
6c50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6c60: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
6c70: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
6c80: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
6c90: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
6ca0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
6cb0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
6cc0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
6cd0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
6ce0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6cf0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6d00: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
6d10: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
6d20: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
6d30: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6d40: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
6d50: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
6d60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
6d70: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
6d80: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
6d90: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
6da0: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rror;.}../*.** S
6db0: 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  can the column t
6dc0: 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28  ype name zType (
6dd0: 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e  length nType) an
6de0: 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  d return the.** 
6df0: 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e  associated affin
6e00: 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20  ity type..**.** 
6e10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
6e20: 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e  s a case-indepen
6e30: 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a  dent search of z
6e40: 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  Type for the .**
6e50: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
6e60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
6e70: 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68  le. If one of th
6e80: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a  e substrings is.
6e90: 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f  ** found, the co
6ea0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69  rresponding affi
6eb0: 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64  nity is returned
6ec0: 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61  . If zType conta
6ed0: 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ins.** more than
6ee0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
6ef0: 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20  trings, entries 
6f00: 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f  toward the top o
6f10: 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  f .** the table 
6f20: 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46  take priority. F
6f30: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a  or example, if z
6f40: 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54  Type is 'BLOBINT
6f50: 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  ', .** SQLITE_AF
6f60: 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74  F_INTEGER is ret
6f70: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62  urned..**.** Sub
6f80: 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66  string     | Aff
6f90: 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  inity.** -------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e  ---------.** 'IN
6fc0: 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c  T'         | SQL
6fd0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a  ITE_AFF_INTEGER.
6fe0: 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20  ** 'CHAR'       
6ff0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7000: 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20  XT.** 'CLOB'    
7010: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7020: 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20  _TEXT.** 'TEXT' 
7030: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7040: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f  AFF_TEXT.** 'BLO
7050: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7060: 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27  TE_AFF_NONE.** '
7070: 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53  REAL'        | S
7080: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7090: 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20  * 'FLOA'        
70a0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
70b0: 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20  L.** 'DOUB'     
70c0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
70d0: 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  REAL.**.** If no
70e0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
70f0: 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76  ings in the abov
7100: 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e  e table are foun
7110: 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  d,.** SQLITE_AFF
7120: 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75  _NUMERIC is retu
7130: 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  rned..*/.char sq
7140: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
7150: 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70  e(const Token *p
7160: 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20 3d  Type){.  u32 h =
7170: 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d   0;.  char aff =
7180: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
7190: 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  RIC;.  const uns
71a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20  igned char *zIn 
71b0: 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f  = pType->z;.  co
71c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
71d0: 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70 65  r *zEnd = &pType
71e0: 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a  ->z[pType->n];..
71f0: 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45    while( zIn!=zE
7200: 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  nd ){.    h = (h
7210: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70  <<8) + sqlite3Up
7220: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d  perToLower[*zIn]
7230: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
7240: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
7250: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
7260: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
7270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
7280: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
7290: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
72a0: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ; .    }else if(
72b0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
72c0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
72d0: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
72e0: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
72f0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7300: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
7310: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
7320: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
7330: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
7340: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
7350: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7360: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
7370: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7380: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
7390: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
73a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
73b0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
73c0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
73d0: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
73e0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
73f0: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
7400: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
7410: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7420: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
7430: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
7440: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
7450: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
7460: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
7470: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
7480: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
7490: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
74a0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
74b0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
74c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
74d0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
74e0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
74f0: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
7500: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
7510: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
7520: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
7530: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7540: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
7550: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
7560: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
7570: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
7580: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
7590: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
75a0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
75b0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
75c0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
75d0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
75e0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
75f0: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
7600: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
7610: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
7620: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7630: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
7640: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
7650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
7660: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
7670: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7680: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
7690: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
76a0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
76b0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
76c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
76d0: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
76e0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
76f0: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
7700: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
7710: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
7720: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
7730: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
7740: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7750: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
7760: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
7770: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
7780: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
7790: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
77a0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
77b0: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
77c0: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
77d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
77e0: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
77f0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
7800: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
7810: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
7820: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
7830: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
7840: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
7850: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
7860: 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70 20  pCol;..  if( (p 
7870: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7880: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7890: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
78a0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
78b0: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
78c0: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73  &p->aCol[i];.  s
78d0: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
78e0: 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  zType);.  pCol->
78f0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e  zType = sqlite3N
7900: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 79  ameFromToken(pTy
7910: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
7920: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
7930: 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70  ffinityType(pTyp
7940: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
7950: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
7960: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
7970: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
7980: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
7990: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
79a0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
79b0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
79c0: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
79d0: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
79e0: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
79f0: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
7a00: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
7a10: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
7a20: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
7a30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7a40: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
7a50: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
7a60: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
7a70: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7a80: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
7a90: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
7aa0: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
7ab0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7ac0: 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Expr){.  Table *
7ad0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
7ae0: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
7af0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7b00: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
7b10: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
7b20: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
7b30: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
7b40: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
7b50: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
7b60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7b70: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
7b80: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
7b90: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
7ba0: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
7bb0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
7bc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7bd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7be0: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
7bf0: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  );.      pCol->p
7c00: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
7c10: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
7c20: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
7c30: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
7c40: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
7c50: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
7c60: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
7c70: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
7c80: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
7c90: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
7ca0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
7cb0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
7cc0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
7cd0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
7ce0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
7cf0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
7d00: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
7d10: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
7d20: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
7d30: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
7d40: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
7d50: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
7d60: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
7d70: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
7d80: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
7d90: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
7da0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
7db0: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
7dc0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
7dd0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
7de0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
7df0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
7e00: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
7e10: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
7e20: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
7e30: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
7e40: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
7e50: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
7e60: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
7e70: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
7e80: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
7e90: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
7ea0: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
7eb0: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
7ec0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
7ed0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7ee0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
7ef0: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
7f00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7f10: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
7f20: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
7f30: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
7f40: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
7f50: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
7f60: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
7f70: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
7f80: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
7f90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
7fa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7fb0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7fc0: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
7fd0: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
7fe0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
7ff0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8000: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8010: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8020: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8030: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8040: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8050: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
8060: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
8070: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
8080: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
8090: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
80a0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
80b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
80c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
80d0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
80e0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
80f0: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
8100: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
8110: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
8120: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
8130: 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  >hasPrimKey ){. 
8140: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8150: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8160: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
8170: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
8180: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
8190: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
81a0: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
81b0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
81c0: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
81d0: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
81e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
81f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
8200: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
8210: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
8220: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
8230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
8240: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8250: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
8260: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
8270: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
8280: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8290: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
82a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
82b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
82c0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
82d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
82e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
82f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
8300: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
8310: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
8320: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
8330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8340: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
8350: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
8360: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
8370: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8380: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
8390: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
83a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
83b0: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
83c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
83d0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
83e0: 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  R")==0.        &
83f0: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
8400: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
8410: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
8420: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
8430: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
8440: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74  r;.    pTab->aut
8450: 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a  oInc = autoInc;.
8460: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
8470: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
8480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
8490: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
84a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
84b0: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
84c0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
84d0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
84e0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
84f0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
8500: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  f.  }else{.    s
8510: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
8520: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
8530: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
8540: 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64  r, 0, 0, sortOrd
8550: 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73  er, 0);.    pLis
8560: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
8570: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
8580: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8590: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
85a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
85b0: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
85c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
85d0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
85e0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
85f0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
8600: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
8610: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
8620: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8630: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8640: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
8650: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
8660: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
8670: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
8680: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
8690: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
86a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
86b0: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  e;.  if( pTab ){
86c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43  .    /* The CHEC
86d0: 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  K expression mus
86e0: 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20  t be duplicated 
86f0: 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72  so that tokens r
8700: 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  efer.    ** to m
8710: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e  alloced space an
8720: 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d  d not the (ephem
8730: 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68  eral) text of th
8740: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20  e CREATE TABLE. 
8750: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
8760: 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  */.    pTab->pCh
8770: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
8780: 72 41 6e 64 28 70 54 61 62 2d 3e 70 43 68 65 63  rAnd(pTab->pChec
8790: 6b 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  k, sqlite3ExprDu
87a0: 70 28 70 43 68 65 63 6b 45 78 70 72 29 29 3b 0a  p(pCheckExpr));.
87b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
87c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
87d0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f  CheckExpr);.}../
87e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
87f0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
8800: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8810: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
8820: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
8830: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
8840: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8850: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
8860: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
8870: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8880: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
8890: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65  Table *p;.  Inde
88a0: 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53  x *pIdx;.  CollS
88b0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
88c0: 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20   i;..  if( (p = 
88d0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
88e0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
88f0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
8900: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
8910: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
8920: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
8930: 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f  nType);.  p->aCo
8940: 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f  l[i].pColl = pCo
8950: 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ll;..  /* If the
8960: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
8970: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
8980: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
8990: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a  TE <type>",.  **
89a0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
89b0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
89c0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
89d0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
89e0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
89f0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
8a00: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
8a10: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
8a20: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20  */.  for(pIdx = 
8a30: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
8a40: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
8a50: 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t){.    assert( 
8a60: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31  pIdx->nColumn==1
8a70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
8a80: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
8a90: 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f   ) pIdx->keyInfo
8aa0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c  .aColl[0] = pCol
8ab0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
8ac0: 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63  Call sqlite3Chec
8ad0: 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61  kCollSeq() for a
8ae0: 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ll collating seq
8af0: 75 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64  uences in an ind
8b00: 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ex,.** in order 
8b10: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61  to verify that a
8b20: 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ll the necessary
8b30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8b40: 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64  nces are.** load
8b50: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8b60: 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c  e3CheckIndexColl
8b70: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
8b80: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
8b90: 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20  .  if( pIdx ){. 
8ba0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
8bb0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
8bc0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
8bd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
8be0: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
8bf0: 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  se, pIdx->keyInf
8c00: 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20  o.aColl[i]) ){. 
8c10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8c20: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8c30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8c40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8c60: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
8c70: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
8c80: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
8c90: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
8ca0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
8cb0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
8cc0: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
8cd0: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
8ce0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
8cf0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
8d00: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
8d10: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
8d20: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
8d30: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
8d40: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
8d50: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
8d60: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
8d70: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
8d80: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
8d90: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
8da0: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
8db0: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
8dc0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
8dd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
8de0: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
8df0: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
8e00: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
8e10: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
8e20: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
8e30: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
8e40: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
8e50: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
8e60: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
8e70: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
8e80: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
8e90: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8ea0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
8eb0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c   pParse..*/.Coll
8ec0: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
8ed0: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
8ee0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
8ef0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
8f00: 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  nName){.  sqlite
8f10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8f20: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 64  db;.  u8 enc = d
8f30: 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69  b->enc;.  u8 ini
8f40: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
8f50: 2e 62 75 73 79 3b 0a 0a 20 20 43 6f 6c 6c 53 65  .busy;..  CollSe
8f60: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
8f70: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
8f80: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
8f90: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
8fa0: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
8fb0: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
8fc0: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
8fd0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8fe0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c  e3GetCollSeq(db,
8ff0: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e   pColl, zName, n
9000: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
9010: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  pColl ){.      i
9020: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20  f( nName<0 ){.  
9030: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74        nName = st
9040: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
9050: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9060: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9070: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
9080: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
9090: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
90a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
90b0: 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
90c0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
90d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
90e0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
90f0: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
9100: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
9110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
9120: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
9130: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
9140: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
9150: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
9160: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
9170: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
9180: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
9190: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
91a0: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
91b0: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
91c0: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
91d0: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
91e0: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
91f0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
9200: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9210: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
9220: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
9230: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
9240: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
9250: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
9260: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
9270: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
9280: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
9290: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
92a0: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
92b0: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
92c0: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
92d0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
92e0: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
92f0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
9300: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
9310: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
9320: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
9330: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
9340: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
9350: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
9360: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
9370: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
9380: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
9390: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
93a0: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
93b0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
93c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
93d0: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
93e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
93f0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9400: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
9410: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
9420: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
9430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
9440: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
9450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
9460: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
9470: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
9480: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
9490: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
94a0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
94b0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
94c0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
94d0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
94e0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
94f0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
9500: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
9510: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
9520: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
9530: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
9540: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
9550: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9560: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
9570: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9580: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
9590: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
95a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
95b0: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
95c0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
95d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
95e0: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
95f0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
9600: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
9610: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
9620: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
9630: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
9640: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
9650: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
9660: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
9670: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
9680: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
9690: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
96a0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
96b0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
96c0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
96d0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
96e0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
96f0: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
9700: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
9710: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
9720: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
9730: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
9740: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
9750: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9770: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
9780: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
9790: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
97a0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
97b0: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
97c0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
97d0: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
97e0: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
97f0: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
9800: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9810: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
9820: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
9830: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
9840: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
9850: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9860: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9870: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
9880: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
9890: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
98a0: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
98b0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
98c0: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
98d0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
98e0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
98f0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
9900: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
9910: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
9920: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
9930: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a  Stmt(Table *p){.
9940: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
9950: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
9960: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
9970: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
9980: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9990: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
99a0: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
99b0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
99c0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
99d0: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
99e0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
99f0: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
9a00: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
9a10: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
9a20: 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20  len(z) + 1);.   
9a30: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
9a40: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
9a50: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
9a60: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
9a70: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
9a80: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
9a90: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
9aa0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
9ab0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
9ac0: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
9ad0: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
9ae0: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
9af0: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
9b00: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
9b10: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
9b20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
9b30: 72 63 70 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49  rcpy(zStmt, !OMI
9b40: 54 5f 54 45 4d 50 44 42 26 26 70 2d 3e 69 44 62  T_TEMPDB&&p->iDb
9b50: 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45  ==1 ? "CREATE TE
9b60: 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41  MP TABLE ":"CREA
9b70: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
9b80: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
9b90: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
9ba0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
9bb0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
9bc0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
9bd0: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
9be0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
9bf0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  pCol++){.    str
9c00: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
9c10: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
9c20: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
9c30: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
9c40: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
9c50: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
9c60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
9c70: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
9c80: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
9c90: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
9ca0: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
9cb0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20  zStmt[k], z);.  
9cc0: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
9cd0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
9ce0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
9cf0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
9d00: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
9d10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9d20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
9d30: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
9d40: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
9d50: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
9d60: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
9d70: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
9d80: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
9d90: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
9da0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
9db0: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
9dc0: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
9dd0: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
9de0: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
9df0: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
9e00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
9e10: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
9e20: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
9e30: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
9e40: 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20  disk, unless.** 
9e50: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
9e60: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d  ary table or db-
9e70: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20  >init.busy==1.  
9e80: 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75  When db->init.bu
9e90: 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e  sy==1.** it mean
9ea0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
9eb0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
9ec0: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
9ed0: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
9ee0: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
9ef0: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
9f00: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
9f10: 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20  er table has.** 
9f20: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  recently changed
9f30: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
9f40: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
9f50: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
9f60: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
9f70: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
9f80: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
9f90: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
9fa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
9fb0: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
9fc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
9fd0: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
9fe0: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
9ff0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
a000: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
a010: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
a020: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
a030: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
a040: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
a050: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
a060: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
a070: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
a080: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
a090: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
a0a0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20  lite3EndTable(. 
a0b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a0d0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
a0e0: 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20  oken *pCons,    
a0f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c         /* The ',
a100: 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68  ' token after th
a110: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65  e last column de
a120: 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  fn. */.  Token *
a130: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
a140: 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29   /* The final ')
a150: 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43  ' token in the C
a160: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
a170: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
a180: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
a190: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
a1a0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
a1b0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a1c0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
a1d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
a1e0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
a1f0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
a200: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
a210: 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d   sqlite3Tsd()->m
a220: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
a230: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
a240: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
a250: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
a260: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
a270: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
a280: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
a290: 65 63 74 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ect );..#ifndef 
a2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
a2b0: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
a2c0: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
a2d0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
a2e0: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
a2f0: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
a300: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73 53  {.    SrcList sS
a310: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a320: 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72        /* Fake Sr
a330: 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73 65  cList for pParse
a340: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20  ->pNewTable */. 
a350: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a360: 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  NC;             
a370: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
a380: 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  xt for pParse->p
a390: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  NewTable */..   
a3a0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
a3b0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
a3c0: 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c     memset(&sSrc,
a3d0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29   0, sizeof(sSrc)
a3e0: 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63  );.    sSrc.nSrc
a3f0: 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61   = 1;.    sSrc.a
a400: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a  [0].zName = p->z
a410: 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61  Name;.    sSrc.a
a420: 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20  [0].pTab = p;.  
a430: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72    sSrc.a[0].iCur
a440: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e  sor = -1;.    sN
a450: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
a460: 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
a470: 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20  ist = &sSrc;.   
a480: 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31   sNC.isCheck = 1
a490: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
a4a0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
a4b0: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63  s(&sNC, p->pChec
a4c0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  k) ){.      retu
a4d0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
a4e0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
a4f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
a500: 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  CK) */..  /* If 
a510: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
a520: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
a530: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
a540: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
a550: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
a560: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
a570: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
a580: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
a590: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
a5a0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
a5b0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
a5c0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
a5d0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
a5e0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
a5f0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
a600: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
a610: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
a620: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
a630: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
a640: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
a650: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
a660: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
a670: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
a680: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
a690: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
a6a0: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
a6b0: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
a6c0: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
a6d0: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
a6e0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
a6f0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
a700: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
a710: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20   record number. 
a720: 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
a730: 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75  table entry shou
a740: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e  ld already be on
a750: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
a760: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
a770: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
a780: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
a790: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
a7a0: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
a7b0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
a7c0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
a7d0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
a7e0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
a7f0: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
a800: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
a810: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
a820: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
a830: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
a840: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
a850: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
a860: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
a870: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
a880: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
a890: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
a8a0: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
a8b0: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
a8c0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a8d0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
a8e0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
a8f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a900: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
a910: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
a920: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
a930: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
a940: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
a950: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
a960: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
a970: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
a980: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
a990: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
a9a0: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
a9b0: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
a9c0: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
a9d0: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
a9e0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
a9f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
aa00: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
aa10: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
aa20: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
aa30: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
aa40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aa50: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
aa60: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
aa70: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
aa80: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
aa90: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
aaa0: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
aab0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
aac0: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
aad0: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
aae0: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
aaf0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
ab00: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
ab10: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
ab20: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
ab30: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
ab40: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
ab50: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
ab60: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
ab70: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
ab80: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
ab90: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
aba0: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
abb0: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
abc0: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
abd0: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
abe0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
abf0: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
ac00: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
ac10: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
ac20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ac30: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
ac40: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
ac50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ac60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
ac70: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
ac80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac90: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
aca0: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
acb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
acc0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
acd0: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
ace0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
acf0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
ad00: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ad10: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62  pSelect, SRT_Tab
ad20: 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20  le, 1, 0, 0, 0, 
ad30: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ad40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ad50: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
ad60: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
ad70: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
ad80: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
ad90: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ada0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
adb0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
adc0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
add0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ade0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
adf0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
ae00: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
ae10: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
ae20: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
ae30: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
ae40: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
ae50: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
ae60: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
ae70: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
ae80: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
ae90: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
aea0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
aeb0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
aec0: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
aed0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
aee0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
aef0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
af00: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
af10: 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d  leStmt(p);.    }
af20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
af30: 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65  pEnd->z - pParse
af40: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b  ->sNameToken.z +
af50: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
af60: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
af70: 28 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73  ("CREATE %s %.*s
af80: 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
af90: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
afa0: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .z);.    }..    
afb0: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
afc0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
afd0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
afe0: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
aff0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
b000: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
b010: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
b020: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
b030: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
b040: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
b050: 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20  collected.  The 
b060: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70 72  rowid for the pr
b070: 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a  eallocated.    *
b080: 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e  * slot is the 2n
b090: 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  d item on the st
b0a0: 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66  ack.  The top of
b0b0: 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68   the stack is th
b0c0: 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
b0d0: 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ge for the new t
b0e0: 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20  able (or a 0 if 
b0f0: 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29 2e  this is a view).
b100: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
b110: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
b120: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
b130: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
b140: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
b150: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
b160: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
b170: 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20  page=#0, sql=%Q 
b180: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
b190: 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20 20  rowid=#1",.     
b1a0: 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d   db->aDb[p->iDb]
b1b0: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
b1c0: 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20  ABLE(p->iDb),.  
b1d0: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
b1e0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
b1f0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
b200: 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
b210: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74    sqliteFree(zSt
b220: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
b230: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
b240: 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 23 69   v, p->iDb);..#i
b250: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b260: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
b270: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
b280: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
b290: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
b2a0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
b2b0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
b2c0: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
b2d0: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
b2e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b2f0: 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20   p->autoInc ){. 
b300: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
b310: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b  db->aDb[p->iDb];
b320: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
b330: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
b340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
b350: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
b360: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
b370: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
b380: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
b390: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
b3a0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
b3b0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
b3c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
b3d0: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
b3e0: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
b3f0: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
b400: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
b410: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
b420: 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
b430: 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20  Schema, p->iDb, 
b440: 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0,.        sqlit
b450: 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e  e3MPrintf("tbl_n
b460: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
b470: 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
b480: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
b490: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
b4a0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
b4b0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
b4c0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
b4d0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
b4e0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
b4f0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
b500: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
b510: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20  FKey *pFKey; .  
b520: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
b530: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
b540: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
b550: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
b560: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
b570: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
b580: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
b590: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
b5a0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
b5b0: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
b5c0: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
b5d0: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
b5e0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
b5f0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  turn;.    }.#ifn
b600: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b610: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
b620: 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b  for(pFKey=p->pFK
b630: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
b640: 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f  =pFKey->pNextFro
b650: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
b660: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
b670: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
b680: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
b690: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
b6a0: 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  nd(&pDb->aFKey, 
b6b0: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  pFKey->zTo, nTo)
b6c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48  ;.      sqlite3H
b6d0: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
b6e0: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
b6f0: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
b700: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b710: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b720: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
b730: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
b740: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
b750: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
b760: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b770: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
b780: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
b790: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 61 73  lect ){.      as
b7a0: 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
b7b0: 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
b7c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
b7d0: 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70 43 6f 6e 73  ns->z==0 ) pCons
b7e0: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
b7f0: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
b800: 20 31 33 20 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20   13 + (pCons->z 
b810: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
b820: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23  oken.z);.    }.#
b830: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
b840: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b850: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
b860: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
b870: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
b880: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
b890: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
b8a0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
b8b0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
b8c0: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
b8d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b8e0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
b8f0: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
b900: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
b910: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
b920: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
b930: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
b940: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b950: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b960: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
b970: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
b980: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
b990: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
b9a0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
b9b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b9c0: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
b9d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
b9e0: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
b9f0: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
ba00: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
ba10: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
ba20: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
ba30: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ba40: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
ba50: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
ba60: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
ba70: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
ba80: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
ba90: 65 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  e;..  if( pParse
baa0: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
bab0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bac0: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
bad0: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
bae0: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
baf0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
bb00: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
bb10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bb20: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
bb30: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42  Table(pParse, pB
bb40: 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  egin, pName1, pN
bb50: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
bb60: 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   0);.  p = pPars
bb70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
bb80: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
bb90: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
bba0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
bbb0: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
bbc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
bbd0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
bbe0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
bbf0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
bc00: 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
bc10: 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
bc20: 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20  pParse, p->iDb, 
bc30: 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20  "view", pName). 
bc40: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
bc50: 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
bc60: 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20  elect).  ){.    
bc70: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
bc80: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
bc90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
bca0: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
bcb0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
bcc0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
bcd0: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
bce0: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
bcf0: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
bd00: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
bd10: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
bd20: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
bd30: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
bd40: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
bd50: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
bd60: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
bd70: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
bd80: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
bd90: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
bda0: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
bdb0: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
bdc0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
bdd0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c  e3SelectDup(pSel
bde0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ect);.  sqlite3S
bdf0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
be00: 65 63 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ect);.  if( sqli
be10: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
be20: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
be30: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
be40: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
be50: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
be60: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
be70: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
be80: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
be90: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
bea0: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
beb0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
bec0: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
bed0: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
bee0: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
bef0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
bf00: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
bf10: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
bf20: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
bf30: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
bf40: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
bf50: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
bf60: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
bf70: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
bf80: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
bf90: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
bfa0: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
bfb0: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
bfc0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
bfd0: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
bfe0: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
bff0: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
c000: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
c010: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
c020: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
c030: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
c040: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
c050: 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20   0, &sEnd, 0);. 
c060: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
c070: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c080: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
c090: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c0a0: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  EW./*.** The Tab
c0b0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
c0c0: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
c0d0: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
c0e0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
c0f0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
c100: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
c110: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
c120: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
c130: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
c140: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
c150: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
c160: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
c170: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
c180: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c190: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
c1a0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
c1b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
c1c0: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
c1d0: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
c1e0: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
c1f0: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
c200: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
c210: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
c220: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
c230: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
c240: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
c250: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
c260: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c270: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
c280: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
c290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
c2a0: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
c2b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
c2c0: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
c2d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
c2e0: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
c2f0: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
c300: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
c310: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
c320: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
c330: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
c340: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
c350: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
c360: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
c370: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
c380: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
c390: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
c3a0: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
c3b0: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
c3c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
c3d0: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
c3e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
c3f0: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
c400: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
c410: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
c420: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
c430: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
c440: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
c450: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
c460: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
c470: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
c480: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
c490: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
c4a0: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
c4b0: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
c4c0: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
c4d0: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
c4e0: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
c4f0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
c500: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
c510: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
c520: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
c530: 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  e..  */.#if 0.  
c540: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
c550: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
c560: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c570: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
c580: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
c590: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
c5a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
c5b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
c5c0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
c5d0: 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
c5e0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
c5f0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
c600: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
c610: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
c620: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
c630: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
c640: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
c650: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
c660: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
c670: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
c680: 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
c690: 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
c6a0: 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
c6b0: 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
c6c0: 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
c6d0: 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
c6e0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
c6f0: 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
c700: 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
c710: 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
c720: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
c730: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
c740: 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
c750: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
c760: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
c770: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
c780: 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
c790: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
c7a0: 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53  ctDup(pTable->pS
c7b0: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53  elect);.  if( pS
c7c0: 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  el ){.    n = pP
c7d0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
c7e0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
c7f0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
c800: 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
c810: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
c820: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c  l = -1;.    pSel
c830: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
c840: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
c850: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
c860: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
c870: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
c880: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
c890: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
c8a0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
c8b0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
c8c0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
c8d0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
c8e0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
c8f0: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
c900: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->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 20 20 73 71 6c 69 74  = 0;.      sqlit
c930: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
c940: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
c950: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70   DbSetProperty(p
c960: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c  Parse->db, pTabl
c970: 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73  e->iDb, DB_Unres
c980: 65 74 56 69 65 77 73 29 3b 0a 20 20 20 20 7d 65  etViews);.    }e
c990: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
c9a0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
c9b0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
c9c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c9d0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a  ctDelete(pSel);.
c9e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
c9f0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
ca00: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
ca10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ca20: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
ca30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ca40: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
ca50: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
ca60: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
ca70: 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
ca80: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
ca90: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
caa0: 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
cab0: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
cac0: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
cad0: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
cae0: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
caf0: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
cb00: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
cb10: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
cb20: 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61  ->aDb[idx].tblHa
cb30: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
cb40: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
cb50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
cb60: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
cb70: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
cb80: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
cb90: 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c    sqliteResetCol
cba0: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a  umnNames(pTab);.
cbb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
cbc0: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
cbd0: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
cbe0: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
cbf0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
cc00: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
cc10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cc20: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
cc30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
cc40: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
cc50: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
cc60: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
cc70: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
cc80: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
cc90: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
cca0: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
ccb0: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
ccc0: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
ccd0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
cce0: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
ccf0: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
cd00: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f  om.** to iTo..*/
cd10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cd20: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
cd30: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
cd40: 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44  PageMoved(Db *pD
cd50: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
cd60: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
cd70: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20  em *pElem;.  .  
cd80: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
cd90: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
cda0: 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  tblHash); pElem;
cdb0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
cdc0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
cdd0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
cde0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
cdf0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
ce00: 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
ce10: 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
ce20: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
ce30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
ce40: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d  .  }.  for(pElem
ce50: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
ce60: 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b  (&pDb->idxHash);
ce70: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
ce80: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
ce90: 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
cea0: 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
ceb0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
cec0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
ced0: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
cee0: 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
cef0: 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  To;.      return
cf00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
cf10: 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69  sert(0);.}.#endi
cf20: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
cf30: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
cf40: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
cf50: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
cf60: 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
cf70: 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
cf80: 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
cf90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
cfa0: 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
cfb0: 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
cfc0: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
cfd0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
cfe0: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
cff0: 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
d000: 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
d010: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
d020: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
d030: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
d040: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
d050: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d060: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d070: 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
d080: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
d090: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d0a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
d0b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d0c0: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
d0d0: 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65  le, iDb);.#ifnde
d0e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d0f0: 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
d100: 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73 20  _Destroy pushes 
d110: 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20  an integer onto 
d120: 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68  the stack. If th
d130: 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
d140: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
d150: 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
d160: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
d170: 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
d180: 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
d190: 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
d1a0: 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
d1b0: 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
d1c0: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
d1d0: 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
d1e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
d1f0: 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  #0" in the SQL i
d200: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
d210: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
d220: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
d230: 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f   ** is on the to
d240: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
d250: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
d260: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
d270: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
d280: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
d290: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
d2a0: 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
d2b0: 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72  d WHERE #0 AND r
d2c0: 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20  ootpage=#0",.   
d2d0: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
d2e0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
d2f0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
d300: 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66   iTable);.#endif
d310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
d320: 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
d330: 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
d340: 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
d350: 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
d360: 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
d370: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
d380: 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
d390: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
d3a0: 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
d3b0: 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
d3c0: 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
d3d0: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
d3e0: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
d3f0: 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
d400: 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
d410: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
d420: 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
d430: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
d440: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
d450: 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
d460: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
d470: 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
d480: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d490: 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  UM.  Index *pIdx
d4a0: 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
d4b0: 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
d4c0: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44  ->tnum, pTab->iD
d4d0: 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
d4e0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d4f0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d500: 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
d510: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
d520: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49  , pIdx->tnum, pI
d530: 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65  dx->iDb);.  }.#e
d540: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
d550: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
d560: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
d570: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
d580: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d590: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
d5a0: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
d5b0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
d5c0: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
d5d0: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
d5e0: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
d5f0: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
d600: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
d610: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
d620: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
d630: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
d640: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
d650: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
d660: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
d670: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
d680: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
d690: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
d6a0: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
d6b0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
d6c0: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
d6d0: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
d6e0: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
d6f0: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
d700: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
d710: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
d720: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
d730: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
d740: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
d750: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
d760: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
d770: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
d780: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
d790: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
d7a0: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
d7b0: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
d7c0: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
d7d0: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
d7e0: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
d7f0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
d800: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
d810: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
d820: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
d830: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
d840: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
d850: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
d860: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
d870: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
d880: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
d890: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
d8a0: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
d8b0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d8c0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d8d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
d8e0: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
d8f0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
d900: 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62   pIdx->iDb==pTab
d910: 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20 69  ->iDb );.      i
d920: 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
d930: 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
d940: 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
d950: 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
d960: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
d970: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
d980: 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
d990: 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  est==0 ) return;
d9a0: 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
d9b0: 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
d9c0: 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44 62  rgest, pTab->iDb
d9d0: 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79 65  );.    iDestroye
d9e0: 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
d9f0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
da00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
da10: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
da20: 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
da30: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
da40: 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
da50: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
da60: 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
da70: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
da80: 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
da90: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
daa0: 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
dab0: 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
dac0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
dad0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
dae0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
daf0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
db00: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
db10: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
db20: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
db30: 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  Failed ) goto ex
db40: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
db50: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
db60: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61  nSrc==1 );.  pTa
db70: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
db80: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
db90: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
dba0: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
dbb0: 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28  atabase);..  if(
dbc0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
dbd0: 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20  if( noErr ){.   
dbe0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43     sqlite3ErrorC
dbf0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
dc00: 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69    }.    goto exi
dc10: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
dc20: 7d 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  }.  iDb = pTab->
dc30: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
dc40: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
dc50: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
dc60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
dc70: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
dc80: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
dc90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
dca0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
dcb0: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
dcc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
dcd0: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
dce0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
dcf0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
dd00: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
dd10: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
dd20: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
dd30: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
dd40: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
dd50: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
dd60: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
dd70: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
dd80: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
dd90: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
dda0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
ddb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
ddc0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
ddd0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
dde0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ddf0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
de00: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
de10: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
de20: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
de30: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
de40: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
de50: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
de60: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
de70: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
de80: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
de90: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, 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 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
dee0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
def0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
df00: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
df10: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
df20: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
df30: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
df40: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
df50: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c  Tab->readOnly ||
df60: 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69   pTab==db->aDb[i
df70: 44 62 5d 2e 70 53 65 71 54 61 62 20 29 7b 0a 20  Db].pSeqTab ){. 
df80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
df90: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
dfa0: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
dfb0: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
dfc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
dfd0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
dfe0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
dff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
e000: 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
e010: 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
e020: 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
e030: 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
e040: 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
e050: 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
e060: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
e070: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
e080: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e090: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
e0a0: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
e0b0: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
e0c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
e0d0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e0e0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
e0f0: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
e100: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
e110: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e120: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
e130: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
e140: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
e150: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e160: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e170: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
e180: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
e190: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
e1a0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
e1b0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
e1c0: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
e1d0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
e1e0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e1f0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
e200: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
e210: 65 72 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20  er;.    int iDb 
e220: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
e230: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
e240: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
e250: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
e260: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
e270: 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   0, iDb);..    /
e280: 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
e290: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
e2a0: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
e2b0: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
e2c0: 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65  e.    ** is gene
e2d0: 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
e2e0: 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
e2f0: 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
e300: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f  r.    ** sqlite_
e310: 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
e320: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
e330: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
e340: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
e350: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
e360: 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
e370: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44  rt( pTrigger->iD
e380: 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69 67 67  b==iDb || pTrigg
e390: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
e3a0: 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
e3b0: 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
e3c0: 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a  , pTrigger, 1);.
e3d0: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
e3e0: 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
e3f0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
e400: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e410: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
e420: 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
e430: 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
e440: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
e450: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
e460: 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62  h.    ** the tab
e470: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
e480: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
e490: 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
e4a0: 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a  is dropped.    *
e4b0: 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
e4c0: 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
e4d0: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
e4e0: 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
e4f0: 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  .    ** move as 
e500: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
e510: 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
e520: 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
e530: 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  mode)..    */.  
e540: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f    if( pTab->auto
e550: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Inc ){.      sql
e560: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
e570: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
e580: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
e590: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
e5a0: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
e5b0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
e5c0: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
e5d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
e5e0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
e5f0: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
e600: 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
e610: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
e620: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
e630: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
e640: 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
e650: 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
e660: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
e670: 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
e680: 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
e690: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
e6a0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
e6b0: 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
e6c0: 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
e6d0: 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
e6e0: 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
e6f0: 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
e700: 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
e710: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
e720: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
e730: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
e740: 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
e750: 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
e760: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
e770: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
e780: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
e790: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
e7a0: 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
e7b0: 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
e7c0: 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
e7d0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
e7e0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
e7f0: 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
e800: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
e810: 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72  w ){.      destr
e820: 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
e830: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pTab);.    }..  
e840: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
e850: 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
e860: 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
e870: 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
e880: 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  dify.    ** the 
e890: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
e8a0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
e8b0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44  3VdbeOp3(v, OP_D
e8c0: 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
e8d0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
e8e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
e8f0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
e900: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
e910: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
e920: 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
e930: 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
e940: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
e950: 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
e960: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e970: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
e980: 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
e990: 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
e9a0: 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
e9b0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
e9c0: 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
e9d0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
e9e0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
e9f0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
ea00: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
ea10: 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
ea20: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
ea30: 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
ea40: 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
ea50: 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
ea60: 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
ea70: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
ea80: 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
ea90: 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
eaa0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
eab0: 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
eac0: 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
ead0: 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
eae0: 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
eaf0: 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
eb00: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
eb10: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
eb20: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
eb30: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
eb40: 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
eb50: 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
eb60: 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
eb70: 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
eb80: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
eb90: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
eba0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
ebb0: 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
ebc0: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
ebd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ebe0: 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e  le field.  The n
ebf0: 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f  ew FKey.** is no
ec00: 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62  t linked into db
ec10: 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20  ->aFKey at this 
ec20: 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65  point - that doe
ec30: 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20  s not happen.** 
ec40: 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64  until sqlite3End
ec50: 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Table()..**.** T
ec60: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
ec70: 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
ec80: 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
ec90: 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
eca0: 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
ecb0: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
ecc0: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
ecd0: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
ece0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ecf0: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
ed00: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ed10: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
ed20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ed30: 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
ed40: 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
ed50: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
ed60: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
ed70: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
ed80: 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
ed90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
eda0: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
edb0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
edc0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
edd0: 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
ede0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
edf0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
ee00: 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
ee10: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
ee20: 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  s. */.){.#ifndef
ee30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
ee40: 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
ee50: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
ee60: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
ee70: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
ee80: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
ee90: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
eea0: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
eeb0: 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
eec0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
eed0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
eee0: 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
eef0: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
ef00: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
ef10: 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  Col-1;.    if( i
ef20: 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f  Col<0 ) goto fk_
ef30: 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
ef40: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
ef50: 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
ef60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ef70: 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
ef80: 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
ef90: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
efa0: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
efb0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
efc0: 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
efd0: 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
efe0: 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
eff0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f000: 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
f010: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
f020: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
f030: 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
f040: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
f050: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f060: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
f070: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f080: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
f090: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
f0a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
f0b0: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
f0c0: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
f0d0: 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
f0e0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
f0f0: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
f100: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
f110: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
f120: 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
f130: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65  nCol*sizeof(pFKe
f140: 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
f150: 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
f160: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
f170: 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
f180: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
f190: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
f1a0: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
f1b0: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
f1c0: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
f1d0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
f1e0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
f1f0: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
f200: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
f210: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
f220: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
f230: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
f240: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
f250: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
f260: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
f270: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
f280: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
f290: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
f2a0: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
f2b0: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
f2c0: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
f2d0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
f2e0: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
f2f0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
f300: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
f310: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
f320: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
f330: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
f340: 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
f350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
f360: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
f370: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
f380: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
f390: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
f3a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
f3b0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
f3c0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
f3d0: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
f3e0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
f3f0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
f400: 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
f410: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f430: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
f440: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
f450: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f460: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
f470: 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
f480: 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
f490: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
f4a0: 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
f4b0: 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
f4c0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
f4d0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
f4e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f4f0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
f500: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f510: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f520: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
f530: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
f540: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
f550: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
f560: 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
f570: 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
f580: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
f590: 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
f5a0: 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
f5b0: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
f5c0: 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
f5d0: 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
f5e0: 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
f5f0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
f600: 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
f610: 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
f620: 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
f630: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
f640: 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
f650: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
f660: 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
f670: 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
f680: 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
f690: 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
f6a0: 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
f6b0: 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
f6c0: 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  ee(pFKey);.#endi
f6d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
f6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f6f0: 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
f700: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
f710: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
f720: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
f730: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
f740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f750: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
f760: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
f770: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
f780: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
f790: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
f7a0: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
f7b0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
f7c0: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
f7d0: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
f7e0: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
f7f0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
f800: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
f810: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
f820: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
f830: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
f840: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
f850: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
f860: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
f870: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
f880: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
f890: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
f8a0: 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
f8b0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
f8c0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
f8d0: 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
f8e0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
f8f0: 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
f900: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
f910: 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
f920: 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
f930: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
f940: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
f950: 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e   isDeferred;.#en
f960: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
f970: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
f980: 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
f990: 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
f9a0: 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
f9b0: 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
f9c0: 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
f9d0: 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
f9e0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
f9f0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
fa00: 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
fa10: 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
fa20: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
fa30: 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
fa40: 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
fa50: 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
fa60: 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
fa70: 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d  reated.  The mem
fa80: 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69  ory cell specifi
fa90: 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
faa0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
fab0: 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
fac0: 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
fad0: 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
fae0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
faf0: 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
fb00: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
fb10: 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
fb20: 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
fb30: 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
fb40: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
fb50: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
fb60: 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
fb70: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
fb80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
fb90: 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
fba0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
fbb0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
fbc0: 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
fbd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
fbe0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
fbf0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
fc00: 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
fc10: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
fc20: 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20  arse->nTab;     
fc30: 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
fc40: 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
fc50: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
fc60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20  pParse->nTab+1; 
fc70: 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
fc80: 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
fc90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  dex */.  int add
fca0: 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
fcb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
fcc0: 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
fcd0: 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  p */.  int tnum;
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
fd00: 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
fd10: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd30: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
fd40: 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
fd50: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 0a 23  al machine */..#
fd60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fd70: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
fd80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
fd90: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
fda0: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
fdb0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
fdc0: 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
fdd0: 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
fde0: 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
fdf0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
fe00: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73  #endif..  /* Ens
fe10: 75 72 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ure all the requ
fe20: 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ired collation s
fe30: 65 71 75 65 6e 63 65 73 20 61 72 65 20 61 76 61  equences are ava
fe40: 69 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20 20 2a  ilable. This.  *
fe50: 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69  * routine will i
fe60: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c 61 74  nvoke the collat
fe70: 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62  ion-needed callb
fe80: 61 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ack if necessary
fe90: 20 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20 6f 6e   (and.  ** if on
fea0: 65 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73  e has been regis
feb0: 74 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69  tered)..  */.  i
fec0: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49  f( sqlite3CheckI
fed0: 6e 64 65 78 43 6f 6c 6c 53 65 71 28 70 50 61 72  ndexCollSeq(pPar
fee0: 73 65 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  se, pIndex) ){. 
fef0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
ff00: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
ff10: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ff20: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
ff30: 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  n;.  if( memRoot
ff40: 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73  Page>=0 ){.    s
ff50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ff60: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d  v, OP_MemLoad, m
ff70: 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a  emRootPage, 0);.
ff80: 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20      tnum = 0;.  
ff90: 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
ffa0: 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
ffb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ffc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72  ddOp(v, OP_Clear
ffd0: 2c 20 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e  , tnum, pIndex->
ffe0: 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  iDb);.  }.  sqli
fff0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10000 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 6e 64  OP_Integer, pInd
10010 65 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73  ex->iDb, 0);.  s
10020 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
10030 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
10040 49 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20  Idx, tnum,.     
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10060 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  char*)&pIndex->k
10070 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
10080 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70  FO);.  sqlite3Op
10090 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69 6e  enTableForReadin
100a0 67 28 76 2c 20 69 54 61 62 2c 20 70 54 61 62 29  g(v, iTab, pTab)
100b0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
100c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
100d0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
100e0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
100f0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
10100 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
10110 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
10120 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
10130 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64  ){.    int curad
10140 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10150 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
10160 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20      int addr2 = 
10170 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73  curaddr+4;.    s
10180 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10190 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c  P2(v, curaddr-1,
101a0 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
101b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
101c0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
101d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
101e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
101f0 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20  AddImm, 1, 0);. 
10200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10210 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  dOp(v, OP_IsUniq
10220 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29  ue, iIdx, addr2)
10230 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10240 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
10250 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10260 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20  NT, OE_Abort,.  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
10290 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
102a0 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
102b0 20 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72      assert( addr
102c0 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75  2==sqlite3VdbeCu
102d0 72 72 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a  rrentAddr(v) );.
102e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
102f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
10300 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29  Insert, iIdx, 0)
10310 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10320 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
10330 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
10340 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
10350 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
10360 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10370 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10380 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
10390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
103a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
103b0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
103c0 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
103d0 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
103e0 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
103f0 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
10400 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
10410 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
10420 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10430 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
10440 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
10450 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
10460 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
10470 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
10480 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
10490 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
104a0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
104b0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
104c0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
104d0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
104e0 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
104f0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
10500 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
10510 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
10520 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
10530 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
10540 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
10550 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
10560 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
10570 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
10580 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
10590 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
105a0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
105b0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
105c0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
105d0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
105e0 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
105f0 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
10600 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
10610 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10620 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10630 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10640 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
10650 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10660 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
10670 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
10680 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
10690 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
106a0 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
106b0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
106c0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
106d0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
106e0 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
106f0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
10700 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
10710 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
10720 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
10730 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
10740 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
10750 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
10760 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
10770 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
10780 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
10790 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
107a0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
107b0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
107c0 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
107d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
107e0 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
107f0 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
10800 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
10810 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
10820 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
10830 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nd,       /* The
10840 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
10850 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
10860 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
10870 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
10880 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
10890 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
108a0 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
108b0 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
108c0 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
108d0 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
108e0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
108f0 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
10900 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
10910 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
10920 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
10930 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
10940 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
10950 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
10960 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
10970 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10980 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
10990 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
109a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
109b0 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
109c0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
109d0 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
109e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
109f0 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
10a00 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
10a10 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
10a20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
10a30 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
10a40 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
10a50 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
10a60 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
10a70 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
10a80 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
10a90 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
10aa0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10ab0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
10ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ad0 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
10ae0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
10af0 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
10b00 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
10b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10b20 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
10b30 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
10b40 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
10b50 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
10b60 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
10b70 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
10b80 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
10b90 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
10ba0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
10bb0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
10bc0 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
10bd0 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
10be0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
10bf0 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
10c00 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
10c10 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
10c20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
10c30 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
10c40 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
10c50 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
10c60 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
10c70 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
10c80 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
10c90 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
10ca0 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
10cb0 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
10cc0 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
10cd0 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
10ce0 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
10cf0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
10d00 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
10d10 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
10d20 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
10d30 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
10d40 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
10d50 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
10d60 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
10d70 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
10d80 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
10d90 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
10da0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10db0 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  dex;..#ifndef SQ
10dc0 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
10dd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
10de0 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
10df0 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
10e00 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c   if the the tabl
10e10 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
10e20 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
10e30 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
10e40 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  e to 1..    */. 
10e50 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
10e60 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
10e70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
10e80 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32  ;.    if( pName2
10e90 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30   && pName2->n==0
10ea0 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
10eb0 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ->iDb==1 ){.    
10ec0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d    iDb = 1;.    }
10ed0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
10ee0 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
10ef0 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
10f00 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
10f10 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73  me) &&.        s
10f20 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
10f30 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
10f40 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
10f50 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
10f60 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
10f70 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
10f80 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
10f90 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
10fa0 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
10fb0 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
10fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
10fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
10fe0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
10ff0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
11000 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
11010 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
11020 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
11030 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
11040 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
11050 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11060 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
11070 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20  =pTab->iDb );.  
11080 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
11090 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
110a0 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
110b0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
110c0 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44    iDb = pTab->iD
110d0 62 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  b;.  }.  pDb = &
110e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
110f0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
11100 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
11110 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11120 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
11130 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
11140 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11150 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
11160 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
11170 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
11180 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
11190 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
111a0 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
111b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
111c0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
111d0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
111e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
111f0 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
11200 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
11210 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
11220 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11230 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
11240 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
11250 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
11260 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
11270 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
11280 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
11290 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
112a0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
112b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
112c0 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
112d0 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
112e0 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
112f0 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
11300 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
11310 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
11320 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
11330 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
11340 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
11350 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
11360 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
11370 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
11380 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
11390 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
113a0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
113b0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
113c0 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
113d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
113e0 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
113f0 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
11400 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
11410 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
11420 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
11430 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
11440 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
11450 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
11460 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
11470 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
11480 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
11490 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ame);.    if( SQ
114a0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
114b0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
114c0 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
114d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
114e0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
114f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11500 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
11510 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
11520 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
11530 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
11540 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11550 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11570 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
11580 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
11590 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
115a0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
115b0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
115c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
115d0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
115e0 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
115f0 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20   pDb->zName)!=0 
11600 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
11610 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
11620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11630 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11640 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
11650 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
11660 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11670 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11680 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11690 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
116a0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
116b0 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
116c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
116d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
116e0 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
116f0 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
11700 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
11710 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
11720 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
11750 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69   zBuf[30];.    i
11760 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
11770 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
11780 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
11790 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
117a0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
117b0 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73  xt, n++){}.    s
117c0 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64  printf(zBuf,"_%d
117d0 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  ",n);.    zName 
117e0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
117f0 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
11800 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
11810 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  dex_", pTab->zNa
11820 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  me, zBuf, (char*
11830 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  )0);.    if( zNa
11840 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
11850 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11860 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
11870 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
11880 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
11890 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
118a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
118b0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
118c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
118d0 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d  *zDb = pDb->zNam
118e0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
118f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11900 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
11910 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
11920 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
11930 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11940 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11950 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
11960 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
11970 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
11980 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
11990 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
119a0 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
119b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
119c0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
119d0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
119e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
119f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11a00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11a10 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
11a20 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
11a30 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
11a40 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
11a50 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
11a60 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
11a70 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
11a80 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
11a90 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
11aa0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
11ab0 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
11ac0 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
11ad0 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
11ae0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
11af0 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
11b00 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b  (u8*)pTab->aCol[
11b10 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
11b20 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
11b30 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
11b40 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  *)nullId.z);.   
11b50 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
11b60 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
11b70 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20  , 0, &nullId);. 
11b80 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
11b90 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11ba0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c  te_index;.    pL
11bb0 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
11bc0 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b  der = sortOrder;
11bd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
11be0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
11bf0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
11c00 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
11c10 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
11c20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d  pIndex = sqliteM
11c30 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e  alloc( sizeof(In
11c40 64 65 78 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 32  dex) + nName + 2
11c50 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b   + sizeof(int) +
11c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11c70 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
11c80 28 69 6e 74 29 2a 32 20 2b 20 73 69 7a 65 6f 66  (int)*2 + sizeof
11c90 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 2a  (CollSeq*) + 1)*
11ca0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  pList->nExpr );.
11cb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 73 64    if( sqlite3Tsd
11cc0 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
11cd0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11ce0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e  ate_index;.  pIn
11cf0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
11d00 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  (int*)&pIndex->k
11d10 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69  eyInfo.aColl[pLi
11d20 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49  st->nExpr];.  pI
11d30 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
11d40 20 28 75 6e 73 69 67 6e 65 64 2a 29 26 70 49 6e   (unsigned*)&pIn
11d50 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
11d60 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70  ist->nExpr];.  p
11d70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
11d80 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61  char*)&pIndex->a
11d90 69 52 6f 77 45 73 74 5b 70 4c 69 73 74 2d 3e 6e  iRowEst[pList->n
11da0 45 78 70 72 2b 31 5d 3b 0a 20 20 70 49 6e 64 65  Expr+1];.  pInde
11db0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 53 6f 72 74  x->keyInfo.aSort
11dc0 4f 72 64 65 72 20 3d 20 26 70 49 6e 64 65 78 2d  Order = &pIndex-
11dd0 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 3b  >zName[nName+1];
11de0 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
11df0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
11e00 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
11e10 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
11e20 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
11e30 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
11e40 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
11e50 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
11e60 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
11e70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65  Name==0;.  pInde
11e80 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20  x->iDb = iDb;.. 
11e90 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11ea0 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
11eb0 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
11ec0 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
11ed0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
11ee0 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
11ef0 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
11f00 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
11f10 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
11f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
11f30 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
11f40 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
11f50 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  C */.  }..  /* S
11f60 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
11f70 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
11f80 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
11f90 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
11fa0 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
11fb0 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
11fc0 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
11fd0 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
11fe0 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
11ff0 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
12000 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
12010 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
12020 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
12030 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
12040 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
12050 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
12060 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d  Name = pListItem
12070 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  ->zName;.    Col
12080 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
12090 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
120a0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 66 6f  ortOrder;.    fo
120b0 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70  r(j=0, pTabCol=p
120c0 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
120d0 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54  b->nCol; j++, pT
120e0 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  abCol++){.      
120f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
12100 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61  mp(zColName, pTa
12110 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  bCol->zName)==0 
12120 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12130 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
12140 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
12150 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12160 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
12170 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
12180 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
12190 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
121a0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  olName);.      g
121b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
121c0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
121d0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
121e0 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66  n[i] = j;.    if
121f0 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
12200 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
12210 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  rt( pListItem->p
12220 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
12230 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
12240 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
12250 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
12260 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  ->pColl;.    }el
12270 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  se{.      pIndex
12280 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12290 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  i] = pTab->aCol[
122a0 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].pColl;.    }.
122b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
122c0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
122d0 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  l[i] );.    if( 
122e0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
122f0 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
12300 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
12310 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b  Parse, pIndex->k
12320 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
12330 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
12340 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12350 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
12360 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
12370 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
12380 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
12390 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
123a0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
123b0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
123c0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
123d0 65 72 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  er;.  }.  pIndex
123e0 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  ->keyInfo.nField
123f0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
12400 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
12410 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
12420 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
12430 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
12440 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
12450 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
12460 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
12470 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
12480 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
12490 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
124a0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
124b0 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
124c0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
124d0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
124e0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
124f0 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
12500 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
12510 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
12520 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
12530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
12540 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
12550 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
12560 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
12570 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
12580 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
12590 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
125a0 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
125b0 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
125c0 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
125d0 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
125e0 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
125f0 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
12600 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
12610 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
12620 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
12630 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
12640 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
12650 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
12660 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
12670 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
12680 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
12690 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
126a0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
126b0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
126c0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
126d0 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
126e0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
126f0 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =OE_None );.    
12700 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12710 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20  autoIndex );.   
12720 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
12730 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
12740 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  one );..      if
12750 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21  ( pIdx->nColumn!
12760 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
12770 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12780 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
12790 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  dx->nColumn; k++
127a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
127b0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
127c0 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
127d0 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
127e0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
127f0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b  >keyInfo.aColl[k
12800 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  ]!=pIndex->keyIn
12810 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72  fo.aColl[k] ) br
12820 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
12830 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
12840 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49  SortOrder[k]!=pI
12850 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 53  ndex->keyInfo.aS
12860 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72  ortOrder[k] ) br
12870 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12880 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e     if( k==pIdx->
12890 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
128a0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
128b0 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e  rror!=pIndex->on
128c0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
128d0 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74     /* This const
128e0 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68  raint creates th
128f0 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20  e same index as 
12900 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
12910 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
12920 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  nt specified som
12930 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52  ewhere in the CR
12940 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
12950 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
12960 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f  ** However the O
12970 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
12980 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
12990 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a  . If both this .
129a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
129b0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20  straint and the 
129c0 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c  previous equival
129d0 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  ent constraint h
129e0 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20  ave explicit.   
129f0 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e         ** ON CON
12a00 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68  FLICT clauses th
12a10 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
12a20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
12a30 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
12a40 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
12a50 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66  fied behaviour f
12a60 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
12a70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12a80 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
12a90 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
12aa0 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
12ab0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
12ac0 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
12ad0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12ae0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
12b00 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
12b10 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
12b20 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
12b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12b40 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
12b50 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
12b60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
12b70 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
12b80 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
12b90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12bb0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12bc0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
12bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12be0 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
12bf0 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
12c00 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
12c10 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
12c20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
12c30 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
12c40 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
12c50 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
12c60 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
12c70 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
12c80 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e  ert(&db->aDb[pIn
12c90 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  dex->iDb].idxHas
12ca0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
12cc0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
12cd0 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
12ce0 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
12cf0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
12d00 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
12d10 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
12d20 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
12d30 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  d */.      goto 
12d40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12d50 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
12d60 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
12d70 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
12d80 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
12d90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
12da0 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
12db0 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
12dc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
12dd0 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
12de0 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
12df0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
12e00 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
12e10 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
12e20 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
12e30 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
12e40 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
12e50 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
12e60 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
12e70 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
12e80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
12e90 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
12ea0 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
12eb0 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
12ec0 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
12ed0 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
12ee0 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
12ef0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
12f00 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
12f10 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
12f20 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
12f30 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
12f40 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
12f50 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
12f60 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
12f70 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
12f80 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
12f90 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
12fa0 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
12fb0 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
12fc0 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
12fd0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
12fe0 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
12ff0 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
13000 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
13010 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
13020 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
13030 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
13040 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
13050 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
13060 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
13070 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
13080 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
13090 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
130a0 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
130b0 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
130c0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
130d0 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
130e0 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
130f0 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
13100 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
13110 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  ++;..    v = sql
13120 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13130 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
13140 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
13150 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20  eate_index;...  
13160 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
13170 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
13180 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
13190 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
131a0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
131b0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
131c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
131d0 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
131e0 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ndex, iDb, 0);. 
131f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13200 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
13210 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20  re, iMem, 0);.. 
13220 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
13230 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
13240 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
13250 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
13260 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
13270 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
13280 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
13290 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
132a0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
132b0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
132c0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
132d0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
132e0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
132f0 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
13300 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
13310 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
13320 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
13330 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20   : " UNIQUE",.  
13340 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20        pEnd->z - 
13350 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20  pName->z + 1,.  
13360 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
13370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13380 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
13390 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
133a0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
133b0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
133c0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
133d0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
133e0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
133f0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
13400 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13410 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
13420 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
13430 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
13440 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
13450 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13460 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
13470 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
13480 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
13490 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20  ,%Q,#0,%Q);",.  
134a0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
134b0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
134c0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
134d0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
134e0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
134f0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
13500 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
13510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13520 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
13530 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
13540 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  ree(zStmt);..   
13550 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
13560 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
13570 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
13580 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
13590 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
135a0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
135b0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
135c0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
135d0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
135e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
135f0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
13600 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
13610 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
13620 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
13630 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
13640 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
13650 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
13660 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  a, iDb, 0,.     
13670 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
13680 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  tf("name='%q'", 
13690 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
136a0 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
136b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
136c0 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  dOp(v, OP_Expire
136d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
136e0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
136f0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
13700 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
13710 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
13720 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
13730 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
13740 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
13750 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
13760 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
13770 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
13780 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
13790 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
137a0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
137b0 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
137c0 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
137d0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
137e0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
137f0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
13800 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
13810 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
13820 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
13830 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
13840 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
13850 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
13860 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
13870 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
13880 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
13890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
138a0 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
138b0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
138c0 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
138d0 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
138e0 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
138f0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
13900 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
13910 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
13920 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
13930 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
13940 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
13950 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
13960 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
13970 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
13980 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
13990 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
139a0 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
139b0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
139c0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
139d0 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
139e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
139f0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
13a00 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
13a10 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
13a20 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
13a30 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
13a40 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
13a50 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13a60 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
13a70 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62  file format numb
13a80 65 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d  er is at least m
13a90 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65  inFormat..** The
13aa0 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
13ab0 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68  will increase th
13ac0 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75  e file format nu
13ad0 6d 62 65 72 20 69 66 20 6e 65 63 65 73 73 61 72  mber if necessar
13ae0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
13af0 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72  e3MinimumFileFor
13b00 6d 61 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  mat(Parse *pPars
13b10 65 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  e, int iDb, int 
13b20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64  minFormat){.  Vd
13b30 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
13b40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13b50 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
13b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13b70 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43  ddOp(v, OP_ReadC
13b80 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a  ookie, iDb, 1);.
13b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
13bb0 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30  er, minFormat, 0
13bc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13bd0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65  beAddOp(v, OP_Ge
13be0 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
13bf0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
13c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13c10 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
13c20 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
13c30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13c40 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13c50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
13c60 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
13c70 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
13c80 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
13c90 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
13ca0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
13cb0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
13cc0 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
13cd0 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
13ce0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
13cf0 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
13d00 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
13d10 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
13d20 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
13d30 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
13d40 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
13d50 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
13d60 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
13d70 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
13d80 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
13d90 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
13da0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
13db0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
13dc0 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
13dd0 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
13de0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
13df0 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
13e00 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
13e10 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
13e20 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
13e30 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
13e40 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
13e50 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
13e60 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
13e70 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
13e80 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
13e90 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
13ea0 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
13eb0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
13ec0 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
13ed0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
13ee0 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
13ef0 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
13f00 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
13f10 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
13f20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
13f30 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
13f40 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
13f50 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
13f60 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
13f70 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
13f80 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
13f90 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
13fa0 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
13fb0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
13fc0 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
13fd0 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
13fe0 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  ed *a = pIdx->ai
13ff0 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
14000 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
14010 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
14020 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64  000;.  for(i=pId
14030 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31  x->nColumn; i>=1
14040 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i--){.    a[i]
14050 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28   = 10;.  }.  if(
14060 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
14070 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
14080 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
14090 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
140a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
140b0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
140c0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
140d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
140e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
140f0 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
14100 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
14110 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
14120 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14130 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
14140 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
14150 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
14160 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
14170 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
14180 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
14190 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
141a0 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c  lite3Tsd()->mall
141b0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
141c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
141d0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
141e0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
141f0 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
14200 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
14210 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
14220 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14230 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
14240 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
14250 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
14260 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
14270 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
14280 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
14290 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
142a0 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
142b0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
142c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
142d0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
142e0 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
142f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
14300 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
14310 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
14320 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
14330 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
14340 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
14350 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14360 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
14370 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
14380 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
14390 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
143a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
143b0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
143c0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
143d0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
143e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
143f0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
14400 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
14410 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
14420 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
14430 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
14440 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
14450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
14460 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  = db->aDb[pIndex
14470 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
14480 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
14490 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
144a0 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  E(pIndex->iDb);.
144b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
144c0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
144d0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
144e0 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
144f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14500 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
14510 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
14520 5f 54 45 4d 50 44 42 20 26 26 20 70 49 6e 64 65  _TEMPDB && pInde
14530 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20  x->iDb ) code = 
14540 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
14550 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
14560 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14570 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
14580 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
14590 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
145a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
145b0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
145c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
145d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
145e0 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
145f0 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
14600 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
14610 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
14620 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14630 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
14640 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e 64    int iDb = pInd
14650 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c  ex->iDb;.    sql
14660 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
14670 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
14680 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
14690 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  s WHERE name=%Q"
146a0 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
146b0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
146c0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
146d0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
146e0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
146f0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14700 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
14710 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
14720 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
14730 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
14740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14750 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op3(v, OP_DropIn
14760 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e  dex, iDb, 0, pIn
14770 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
14780 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
14790 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
147a0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
147b0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70  me);.}../*.** pp
147c0 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e 74  Array points int
147d0 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77 68  o a structure wh
147e0 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
147f0 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a 2a  array pointer.**
14800 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f   followed by two
14810 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66   integers. The f
14820 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73 20  irst integer is 
14830 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
14840 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
14850 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61 79   structure array
14860 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  .  The second in
14870 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65 20  teger.** is the 
14880 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61  number of alloca
14890 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68 65  ted slots in the
148a0 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e   array..**.** In
148b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
148c0 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b  e structure look
148d0 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  s something like
148e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
148f0 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d 70      struct Examp
14900 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  le1 {.**        
14910 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65 6d    struct subElem
14920 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20   *aEntry;.**    
14930 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79        int nEntry
14940 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  ;.**          in
14950 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20  t nAlloc;.**    
14960 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20      }.**.** The 
14970 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74 65  pnEntry paramete
14980 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
14990 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45 78  equivalent of Ex
149a0 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a  ample1.nEntry..*
149b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
149c0 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  e allocates a ne
149d0 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61 72  w slot in the ar
149e0 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f 75  ray, zeros it ou
149f0 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  t,.** and return
14a00 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49 66  s its index.  If
14a10 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61 20   malloc fails a 
14a20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
14a30 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
14a40 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74 68  ** szEntry is th
14a50 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73 69  e sizeof of a si
14a60 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72 79  ngle array entry
14a70 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74  .  initSize is t
14a80 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
14a90 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20 61   array entries a
14aa0 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20  llocated on the 
14ab0 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69  initial allocati
14ac0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
14ad0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
14ae0 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c 20  void **ppArray, 
14af0 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e 74  int szEntry, int
14b00 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63 68   initSize){.  ch
14b10 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61 6e  ar *p;.  int *an
14b20 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72 61   = (int*)&ppArra
14b30 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b 30  y[1];.  if( an[0
14b40 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  ]>=an[1] ){.    
14b50 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20  void *pNew;.    
14b60 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  int newSize;.   
14b70 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31 5d   newSize = an[1]
14b80 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
14b90 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
14ba0 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61 79  Realloc(*ppArray
14bb0 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72  , newSize*szEntr
14bc0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
14bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
14be0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
14bf0 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69 7a    an[1] = newSiz
14c00 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79 20  e;.    *ppArray 
14c10 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20  = pNew;.  }.  p 
14c20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d 65  = *ppArray;.  me
14c30 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a  mset(&p[an[0]*sz
14c40 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
14c50 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6e  ry);.  return an
14c60 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  [0]++;.}../*.** 
14c70 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
14c80 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
14c90 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
14ca0 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
14cb0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
14cc0 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
14cd0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
14ce0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
14cf0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
14d00 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
14d10 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
14d20 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
14d30 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
14d40 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14d50 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
14d60 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
14d70 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
14d80 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14d90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
14da0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
14db0 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c 69  ;.  }.  i = sqli
14dc0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
14dd0 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74 2d  ((void**)&pList-
14de0 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  >a, sizeof(pList
14df0 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20 69  ->a[0]), 5);.  i
14e00 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
14e10 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
14e20 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  e(pList);.    re
14e30 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
14e40 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
14e50 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14e60 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
14e70 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
14e80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
14e90 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
14ea0 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
14eb0 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
14ec0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
14ed0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14ee0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14ef0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
14f00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
14f10 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
14f20 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
14f30 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
14f40 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
14f50 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
14f60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14f70 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
14f80 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
14f90 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
14fa0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
14fb0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
14fc0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
14fd0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
14fe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14ff0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
15000 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
15010 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
15020 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
15030 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
15040 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
15050 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
15060 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
15070 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
15080 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
15090 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
150a0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
150b0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
150c0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
150d0 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
150e0 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
150f0 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
15100 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
15110 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
15120 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
15130 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
15140 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
15150 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
15160 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
15170 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
15180 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
15190 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
151a0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
151b0 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
151c0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
151d0 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
151e0 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
151f0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
15200 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
15210 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
15220 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
15230 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
15240 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
15250 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
15260 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
15270 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
15280 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
15290 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
152a0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
152b0 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
152c0 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
152d0 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
152e0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
152f0 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
15300 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
15310 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
15320 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
15330 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
15340 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
15350 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
15360 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
15370 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
15380 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,0);.**.** T
15390 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
153a0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
153b0 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
153c0 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
153d0 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
153e0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
153f0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
15400 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
15410 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
15420 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
15430 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
15440 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
15450 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
15460 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c  cListAppend(SrcL
15470 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
15480 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e  n *pTable, Token
15490 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *pDatabase){.  
154a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
154b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
154c0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
154d0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
154e0 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53  Malloc( sizeof(S
154f0 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
15500 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
15510 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
15520 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
15530 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
15540 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c  nSrc>=pList->nAl
15550 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
15560 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c  st *pNew;.    pL
15570 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32  ist->nAlloc *= 2
15580 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
15590 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
155a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
155b0 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
155c0 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
155d0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
155e0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
155f0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
15600 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
15610 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
15620 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
15630 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
15640 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
15650 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
15660 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
15670 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
15680 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
15690 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
156a0 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
156b0 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
156c0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
156d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
156e0 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
156f0 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
15700 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
15710 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
15720 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
15730 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
15740 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
15750 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
15760 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20  Token(pTable);. 
15770 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
15780 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
15790 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61  romToken(pDataba
157a0 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
157b0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
157c0 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
157d0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
157e0 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
157f0 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
15800 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
15810 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
15820 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
15830 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
15840 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
15850 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
15860 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
15870 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
15880 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c  ert(pList || sql
15890 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
158a0 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
158b0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
158c0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
158d0 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
158e0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
158f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +){.      if( pI
15900 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
15910 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
15920 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
15930 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15940 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
15950 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
15960 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
15970 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
15980 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
15990 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
159a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
159b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
159c0 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
159d0 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
159e0 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
159f0 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
15a00 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
15a10 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69  stAddAlias(SrcLi
15a20 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
15a30 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
15a40 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
15a50 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70  >nSrc>0 ){.    p
15a60 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
15a70 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20  Src-1].zAlias = 
15a80 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
15a90 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20  oken(pToken);.  
15aa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
15ab0 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
15ac0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
15ad0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
15ae0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
15af0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
15b00 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29  (SrcList *pList)
15b10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
15b20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
15b30 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
15b40 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
15b50 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
15b60 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
15b70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
15b80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
15b90 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
15ba0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
15bb0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
15bc0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
15bd0 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
15be0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
15bf0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
15c00 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  (0, pItem->pTab)
15c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
15c20 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  ectDelete(pItem-
15c30 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
15c40 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15c50 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  (pItem->pOn);.  
15c60 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
15c70 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73  elete(pItem->pUs
15c80 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
15c90 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
15ca0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
15cb0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
15cc0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
15cd0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
15ce0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
15cf0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
15d00 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
15d10 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
15d20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
15d30 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
15d40 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
15d50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
15d60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
15d70 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64 28  r || sqlite3Tsd(
15d80 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
15d90 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15da0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15db0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15dc0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
15dd0 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65  GIN", 0, 0) ) re
15de0 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
15df0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15e00 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
15e10 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
15e20 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
15e30 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15e40 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
15e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15e60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72  beAddOp(v, OP_Tr
15e70 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
15e80 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
15e90 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  E)+1);.    }.  }
15ea0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15eb0 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
15ec0 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
15ed0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
15ee0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
15ef0 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
15f00 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
15f10 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
15f20 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
15f30 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
15f40 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
15f50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
15f60 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
15f70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
15f80 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
15f90 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e  | sqlite3Tsd()->
15fa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
15fb0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
15fc0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15fd0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
15fe0 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
15ff0 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  T", 0, 0) ) retu
16000 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
16010 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16020 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
16030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16040 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
16050 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
16060 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
16070 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
16080 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
16090 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
160a0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
160b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
160c0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
160d0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
160e0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
160f0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
16100 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
16110 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
16120 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
16130 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
16140 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
16150 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16160 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16170 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
16180 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
16190 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
161a0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
161b0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
161c0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
161d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
161e0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
161f0 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
16200 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
16210 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
16220 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
16230 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
16240 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
16250 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
16260 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
16270 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
16280 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
16290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
162a0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
162b0 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
162c0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
162d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
162e0 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
162f0 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
16300 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
16310 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
16320 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
16330 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58  ry(db, 0, 0, MAX
16340 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62  _PAGES, &db->aDb
16350 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66  [1].pBt);.    if
16360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16370 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16380 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16390 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
163a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
163b0 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
163c0 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
163d0 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
163e0 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
163f0 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
16400 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
16410 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
16420 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f  lags & !db->auto
16430 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
16440 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16450 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
16460 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a  aDb[1].pBt, 1);.
16470 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
164a0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
164b0 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
164c0 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
164d0 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
164e0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
164f0 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50  le");.        pP
16500 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
16510 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
16520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16530 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16540 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16550 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
16560 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
16570 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
16580 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
16590 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
165a0 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
165b0 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
165c0 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
165d0 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
165e0 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
165f0 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
16600 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
16610 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
16620 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
16630 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
16640 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
16650 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
16660 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
16670 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
16680 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
16690 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
166a0 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
166b0 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
166c0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
166d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
166e0 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
166f0 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
16700 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
16710 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
16720 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
16730 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
16740 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
16750 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
16760 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
16770 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
16780 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
16790 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
167a0 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
167b0 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
167c0 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
167d0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
167e0 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
167f0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
16800 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
16810 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
16820 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
16830 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
16840 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
16850 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
16860 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
16870 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
16880 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
16890 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
168a0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
168b0 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
168c0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
168d0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
168e0 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
168f0 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
16900 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
16910 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
16920 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
16930 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
16940 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
16950 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
16960 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
16970 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
16980 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
16990 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
169a0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
169b0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
169c0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
169d0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
169e0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
169f0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
16a00 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
16a10 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16a20 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16a30 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
16a40 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
16a50 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
16a60 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
16a70 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
16a80 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
16a90 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
16aa0 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
16ab0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
16ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16ad0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
16ae0 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
16af0 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b>=0 ){.    asse
16b00 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
16b10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
16b20 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
16b30 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
16b40 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
16b50 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d  32 );.    mask =
16b60 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28   1<<iDb;.    if(
16b70 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65   (pParse->cookie
16b80 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
16b90 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
16ba0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d  >cookieMask |= m
16bb0 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ask;.      pPars
16bc0 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
16bd0 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  Db] = db->aDb[iD
16be0 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
16bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
16c00 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
16c10 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
16c20 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
16c30 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20  abase(pParse);. 
16c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16c60 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
16c70 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
16c80 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
16c90 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
16ca0 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
16cb0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
16cc0 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
16cd0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
16ce0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
16cf0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
16d00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
16d10 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
16d20 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
16d30 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
16d40 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
16d50 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
16d60 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
16d70 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
16d80 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
16d90 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
16da0 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
16db0 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
16dc0 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
16dd0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
16de0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
16df0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
16e00 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
16e10 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
16e20 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
16e30 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
16e40 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
16e50 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
16e60 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
16e70 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
16e80 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
16e90 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
16ea0 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
16eb0 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
16ec0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
16ed0 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
16ee0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
16ef0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
16f00 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
16f10 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
16f20 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
16f30 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
16f40 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
16f50 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
16f60 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
16f70 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
16f80 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
16f90 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
16fa0 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
16fb0 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
16fc0 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
16fd0 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
16fe0 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
16ff0 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
17000 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
17010 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
17020 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
17030 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
17040 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
17050 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
17060 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
17070 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
17080 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
17090 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
170a0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
170b0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
170c0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
170d0 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
170e0 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
170f0 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
17100 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d  ement && pParse-
17110 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
17120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17130 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
17140 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
17150 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d  .  if( (OMIT_TEM
17160 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26  PDB || iDb!=1) &
17170 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  & pParse->db->aD
17180 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
17190 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
171a0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
171b0 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65  arse, setStateme
171c0 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nt, 1);.  }.}../
171d0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
171e0 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
171f0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
17200 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
17210 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
17220 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
17230 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
17240 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
17250 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
17260 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
17270 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c  llationMatch(Col
17280 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64  lSeq *pColl, Ind
17290 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
172a0 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  nt n = pIndex->k
172b0 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20  eyInfo.nField;. 
172c0 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20   CollSeq **pp = 
172d0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
172e0 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  aColl;.  while( 
172f0 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  n-- ){.    if( *
17300 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75  pp==pColl ) retu
17310 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a  rn 1;.    pp++;.
17320 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17330 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17340 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
17350 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
17360 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
17370 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
17380 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
17390 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
173a0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
173b0 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
173c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
173d0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
173e0 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
173f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
17400 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c  able *pTab, Coll
17410 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49  Seq *pColl){.  I
17420 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
17430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
17440 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
17450 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
17460 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
17470 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
17480 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
17490 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
174a0 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( pColl==0 || co
174b0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f  llationMatch(pCo
174c0 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ll,pIndex) ){.  
174d0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
174e0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
174f0 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e  Parse, 0, pTab->
17500 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
17510 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
17520 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
17530 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
17540 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
17550 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
17560 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
17570 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
17580 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
17590 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
175a0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
175b0 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
175c0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
175d0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
175e0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
175f0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
17600 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
17610 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
17620 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
17630 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
17640 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44  Seq *pColl){.  D
17650 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
17660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
17670 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
17680 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
176b0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
176c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
176d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
176e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
176f0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
17700 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
17710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
17720 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
17730 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
17740 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17760 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
17770 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
17780 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
17790 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
177a0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
177b0 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d  ){.    if( pDb==
177c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
177d0 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
177e0 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62  shFirst(&pDb->tb
177f0 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
17800 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
17810 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
17820 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
17830 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
17840 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
17850 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c  rse, pTab, pColl
17860 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
17870 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
17880 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
17890 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
178a0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
178b0 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
178e0 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
178f0 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
17900 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
17910 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
17920 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
17930 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
17940 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
17950 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
17960 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
17970 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
17980 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
17990 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
179a0 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
179b0 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
179c0 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
179d0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
179e0 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
179f0 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
17a00 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
17a10 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
17a20 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
17a30 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
17a40 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
17a50 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
17a60 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
17a70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17a80 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
17a90 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
17aa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
17ab0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
17ac0 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
17ad0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
17ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
17af0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
17b00 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
17b10 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
17b20 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
17b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
17b40 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
17b50 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
17b60 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
17b70 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
17b80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17b90 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
17ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17bb0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
17bc0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
17bd0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bf0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
17c00 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
17c10 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17c30 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
17c40 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
17c50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17c60 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
17c70 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
17c80 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
17c90 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
17ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17cb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
17cc0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
17cd0 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
17ce0 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
17cf0 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
17d00 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
17d10 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
17d20 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
17d30 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
17d40 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
17d50 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
17d60 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
17d70 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
17d80 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
17d90 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
17da0 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20  || pName1->z==0 
17db0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
17dc0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
17dd0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
17de0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
17df0 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d  e2==0 || pName2-
17e00 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  >z==0 ){.    pCo
17e10 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
17e20 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e  CollSeq(db, db->
17e30 65 6e 63 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  enc, (char*)pNam
17e40 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e  e1->z, pName1->n
17e50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
17e60 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
17e70 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
17e80 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  arse, pColl);.  
17e90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
17ea0 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  }.  }.  iDb = sq
17eb0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17ec0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17ed0 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
17ee0 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
17ef0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
17f00 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17f10 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b  Token(pObjName);
17f20 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
17f30 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70  [iDb].zName;.  p
17f40 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
17f50 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
17f60 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
17f70 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
17f80 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
17f90 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
17fa0 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74 75  ree(z);.    retu
17fb0 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
17fc0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
17fd0 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
17fe0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29  .  sqliteFree(z)
17ff0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
18000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
18010 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
18020 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
18030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
18040 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
18050 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
18060 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
18070 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18080 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
18090 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
180a0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
180b0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
180c0 69 66 0a                                         if.