/ Hex Artifact Content
Login

Artifact 7bf6f9ba5b2ea7c654986085211fcd9794cfb5c8:


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 36 20 32 30 30 36 2f 30 31 2f 30 34  1.366 2006/01/04
02f0: 20 32 31 3a 34 30 3a 30 37 20 64 72 68 20 45 78   21:40:07 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 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
110d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
110e0 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20  ndex;.    iDb = 
110f0 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 20  pTab->iDb;.  }. 
11100 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
11110 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54 61  iDb];..  if( pTa
11120 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
11130 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
11140 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11150 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
11160 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
11170 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11180 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
11190 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
111a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
111b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
111c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
111d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
111e0 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
111f0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
11200 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11210 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
11220 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
11230 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
11240 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11250 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
11260 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
11270 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11280 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
11290 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
112a0 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
112b0 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
112c0 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
112d0 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
112e0 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
112f0 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
11300 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
11310 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
11320 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
11330 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
11340 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
11350 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
11360 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
11370 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
11380 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
11390 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
113a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
113b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
113c0 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
113d0 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
113e0 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
113f0 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
11400 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
11410 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
11420 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
11430 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
11440 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
11450 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
11460 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
11470 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
11480 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
11490 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
114a0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
114b0 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
114c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
114d0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
114e0 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
114f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11500 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  dex;.    if( zNa
11510 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
11520 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11530 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
11540 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
11550 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
11560 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
11570 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
11580 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
11590 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
115a0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
115b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
115c0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
115d0 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
115e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
115f0 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  x;.      if( sql
11600 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
11610 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
11620 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
11630 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
11640 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
11650 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11660 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
11670 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
11680 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
11690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
116a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
116b0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
116c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
116d0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
116e0 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
116f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11700 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
11710 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
11720 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
11730 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
11740 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11750 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
11760 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
11770 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
11780 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
11790 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
117a0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
117b0 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
117c0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
117d0 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
117e0 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  {}.    sprintf(z
117f0 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20  Buf,"_%d",n);.  
11800 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
11810 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
11820 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  g(&zName, "sqlit
11830 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70  e_autoindex_", p
11840 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66  Tab->zName, zBuf
11850 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
11860 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
11870 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11880 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
11890 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
118a0 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
118b0 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
118c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
118d0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
118e0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
118f0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
11900 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db->zName;.    i
11910 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11920 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
11930 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
11940 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
11950 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
11960 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11970 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
11980 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
11990 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
119a0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
119b0 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
119c0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
119d0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
119e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
119f0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
11a00 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
11a10 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
11a20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11a30 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
11a40 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
11a50 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
11a60 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
11a70 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
11a80 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
11a90 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
11aa0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
11ab0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
11ac0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
11ad0 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
11ae0 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
11af0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
11b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
11b10 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c  st==0 ){.    nul
11b20 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61  lId.z = (u8*)pTa
11b30 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
11b40 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
11b50 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
11b60 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64  en((char*)nullId
11b70 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
11b80 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11b90 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
11ba0 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
11bb0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
11bc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11bd0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
11be0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
11bf0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
11c00 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
11c10 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
11c20 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
11c30 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
11c40 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  ame);.  pIndex =
11c50 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
11c60 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 6e  izeof(Index) + n
11c70 4e 61 6d 65 20 2b 20 32 20 2b 20 73 69 7a 65 6f  Name + 2 + sizeo
11c80 66 28 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20  f(int) +.       
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 20   (sizeof(int)*2 
11cb0 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  + sizeof(CollSeq
11cc0 2a 29 20 2b 20 31 29 2a 70 4c 69 73 74 2d 3e 6e  *) + 1)*pList->n
11cd0 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71  Expr );.  if( sq
11ce0 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c  lite3Tsd()->mall
11cf0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
11d00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11d10 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  x;.  pIndex->aiC
11d20 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
11d30 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
11d40 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  Coll[pList->nExp
11d50 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  r];.  pIndex->ai
11d60 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
11d70 65 64 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ed*)&pIndex->aiC
11d80 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78  olumn[pList->nEx
11d90 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  pr];.  pIndex->z
11da0 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
11db0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
11dc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b  pList->nExpr+1];
11dd0 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
11de0 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  fo.aSortOrder = 
11df0 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e  &pIndex->zName[n
11e00 4e 61 6d 65 2b 31 5d 3b 0a 20 20 73 74 72 63 70  Name+1];.  strcp
11e10 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
11e20 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
11e30 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
11e40 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
11e50 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
11e60 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
11e70 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
11e80 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
11e90 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
11ea0 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d  .  pIndex->iDb =
11eb0 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   iDb;..  /* Chec
11ec0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
11ed0 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
11ee0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
11ef0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
11f00 20 20 69 66 28 20 70 44 62 2d 3e 66 69 6c 65 5f    if( pDb->file_
11f10 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
11f20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
11f30 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
11f40 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
11f50 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
11f60 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
11f70 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
11f80 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
11f90 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
11fa0 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
11fb0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
11fc0 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
11fd0 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
11fe0 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
11ff0 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
12000 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
12010 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
12020 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
12030 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69  /.  for(i=0, pLi
12040 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b  stItem=pList->a;
12050 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
12060 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
12070 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
12080 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70  ar *zColName = p
12090 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  ListItem->zName;
120a0 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  .    Column *pTa
120b0 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65  bCol;.    int re
120c0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
120d0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ;.    for(j=0, p
120e0 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
120f0 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
12100 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
12110 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
12120 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
12130 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
12140 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
12150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
12160 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
12170 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12180 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
12190 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
121a0 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
121b0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
121c0 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
121d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
121e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
121f0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
12200 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
12210 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
12220 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20  tem->pExpr ){.  
12230 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
12240 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
12250 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e  oll );.      pIn
12260 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
12270 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 49 74 65  ll[i] = pListIte
12280 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b  m->pExpr->pColl;
12290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
122a0 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
122b0 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61  o.aColl[i] = pTa
122c0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c  b->aCol[j].pColl
122d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
122e0 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  rt( pIndex->keyI
122f0 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a  nfo.aColl[i] );.
12300 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
12310 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20 20  t.busy && .     
12320 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43     sqlite3CheckC
12330 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12340 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
12350 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b  Coll[i]) .    ){
12360 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
12370 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12380 20 20 20 7d 0a 20 20 20 20 72 65 71 75 65 73 74     }.    request
12390 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
123a0 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
123b0 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
123c0 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
123d0 6b 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64  keyInfo.aSortOrd
123e0 65 72 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65  er[i] = requeste
123f0 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
12400 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
12410 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74  o.nField = pList
12420 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
12430 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
12440 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20  pIndex);..  if( 
12450 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
12460 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
12470 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
12480 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
12490 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
124a0 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
124b0 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
124c0 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
124d0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
124e0 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
124f0 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
12500 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
12510 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
12520 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
12530 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
12540 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
12550 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
12560 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
12570 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
12580 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
12590 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
125a0 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
125b0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
125c0 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
125d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
125e0 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
125f0 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
12600 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
12610 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
12620 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
12630 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
12640 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
12650 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
12660 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
12670 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
12680 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
12690 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
126a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
126b0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
126c0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
126d0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
126e0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
126f0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
12700 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12710 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
12720 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12730 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
12740 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
12750 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
12760 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
12770 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12780 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
12790 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
127a0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
127b0 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
127c0 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
127d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
127e0 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
127f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
12800 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
12810 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  f( pIdx->keyInfo
12820 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65  .aColl[k]!=pInde
12830 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
12840 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
12850 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6b       if( pIdx->k
12860 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65  eyInfo.aSortOrde
12870 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  r[k]!=pIndex->ke
12880 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yInfo.aSortOrder
12890 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
128a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
128b0 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
128c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
128d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
128e0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
128f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
12900 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
12910 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
12920 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
12930 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
12940 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
12950 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
12960 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
12970 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
12980 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
12990 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
129a0 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
129b0 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
129c0 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
129d0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
129e0 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
129f0 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
12a00 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
12a10 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
12a20 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
12a30 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
12a40 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
12a50 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
12a60 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
12a70 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
12a80 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69  aviour for the i
12a90 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
12aa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
12ab0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
12ac0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
12ad0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
12ae0 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
12af0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12b00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12b10 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
12b20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
12b30 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
12b40 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
12b50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
12b60 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
12b70 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
12b80 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
12b90 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
12ba0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
12bb0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
12bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12bd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
12be0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12c00 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
12c10 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
12c20 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
12c30 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
12c40 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
12c50 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
12c60 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
12c70 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
12c80 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
12c90 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
12ca0 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
12cb0 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
12cc0 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ].idxHash, .    
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
12cf0 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65  me, strlen(pInde
12d00 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  x->zName)+1, pIn
12d10 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
12d20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12d30 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
12d40 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
12d50 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
12d60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12d70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12d80 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
12d90 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
12da0 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20  hanges;.    if( 
12db0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
12dc0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
12dd0 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
12de0 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tnum;.    }.  }.
12df0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
12e00 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
12e10 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
12e20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
12e30 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
12e40 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
12e50 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
12e60 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
12e70 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
12e80 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
12e90 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
12ea0 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
12eb0 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74   ** The db->init
12ec0 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20  .busy is 0 when 
12ed0 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
12ee0 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
12ef0 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
12f00 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  nd.  db->init.bu
12f10 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  sy is 1 when a d
12f20 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
12f30 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
12f40 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
12f50 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
12f60 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
12f70 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
12f80 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
12f90 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
12fa0 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
12fb0 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
12fc0 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
12fd0 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
12fe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
12ff0 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61  blName==0 it mea
13000 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
13010 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20   generated as a 
13020 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
13030 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
13040 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54  raint of a CREAT
13050 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
13060 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
13070 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
13080 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
13090 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
130a0 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
130b0 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
130c0 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
130d0 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
130e0 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69    else if( db->i
130f0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
13100 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
13110 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
13120 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
13130 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20  se->nMem++;..   
13140 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13150 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
13160 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
13170 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13180 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ex;...    /* Cre
13190 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
131a0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
131b0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
131c0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
131d0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
131e0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
131f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13200 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
13210 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
13220 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13230 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
13240 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  , 0);..    /* Ga
13250 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
13260 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
13270 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
13280 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
13290 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
132a0 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
132b0 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
132c0 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  d ){.      /* A 
132d0 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
132e0 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
132f0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
13300 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
13310 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
13320 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e  ntf("CREATE%s IN
13330 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
13340 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
13350 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
13360 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
13370 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
13380 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
13390 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
133a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
133b0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
133c0 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
133d0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
133e0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
133f0 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
13400 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
13410 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
13420 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
13430 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
13440 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
13450 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
13460 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
13470 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
13480 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
13490 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
134a0 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
134b0 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25  ndex',%Q,%Q,#0,%
134c0 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
134d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
134e0 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
134f0 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
13500 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
13510 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
13520 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
13530 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
13540 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13550 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
13560 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d   sqliteFree(zStm
13570 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
13580 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
13590 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
135a0 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
135b0 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
135c0 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
135d0 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
135e0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
135f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13600 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
13610 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
13620 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
13630 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
13640 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
13650 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
13660 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13670 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
13680 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
13690 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
136a0 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65  te3MPrintf("name
136b0 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
136c0 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
136d0 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
136e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
136f0 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b  P_Expire, 0, 0);
13700 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13710 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
13720 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
13730 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
13740 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
13750 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
13760 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
13770 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
13780 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
13790 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
137a0 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
137b0 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
137c0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
137d0 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
137e0 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
137f0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
13800 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
13810 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
13820 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
13830 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
13840 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
13850 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
13860 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
13870 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
13880 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
13890 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
138a0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
138b0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
138c0 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
138d0 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
138e0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
138f0 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
13900 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
13910 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
13920 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
13930 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
13940 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
13950 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
13960 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
13970 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
13980 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
13990 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
139a0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
139b0 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
139c0 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
139d0 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
139e0 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
139f0 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65   ){.    freeInde
13a00 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
13a10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
13a20 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
13a30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
13a40 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b  elete(pTblName);
13a50 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
13a60 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
13a70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13a80 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73  e code to make s
13a90 75 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ure the file for
13aa0 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74  mat number is at
13ab0 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74   least minFormat
13ac0 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74  ..** The generat
13ad0 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63  ed code will inc
13ae0 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66  rease the file f
13af0 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20  ormat number if 
13b00 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f  necessary..*/.vo
13b10 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75  id sqlite3Minimu
13b20 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73  mFileFormat(Pars
13b30 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
13b40 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61  Db, int minForma
13b50 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  t){.  Vdbe *v;. 
13b60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13b70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13b80 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
13b90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13ba0 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
13bb0 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 1);.    sqli
13bc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13bd0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46  OP_Integer, minF
13be0 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
13bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13c00 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c  v, OP_Ge, 0, sql
13c10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13c20 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73  ddr(v)+3);.    s
13c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13c40 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
13c50 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  inFormat, 0);.  
13c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13c70 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
13c80 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d  ie, iDb, 1);.  }
13c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
13ca0 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
13cb0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
13cc0 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
13cd0 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
13ce0 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
13cf0 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
13d00 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
13d10 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
13d20 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
13d30 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
13d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
13d50 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
13d60 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
13d70 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
13d80 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
13d90 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
13da0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
13db0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
13dc0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
13dd0 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
13de0 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
13df0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
13e00 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
13e10 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
13e20 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
13e30 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
13e40 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
13e50 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
13e60 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69  cular combiniati
13e70 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
13e80 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
13e90 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
13ea0 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
13eb0 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
13ec0 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
13ed0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
13ee0 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
13ef0 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
13f00 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
13f10 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
13f20 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
13f30 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
13f40 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
13f50 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
13f60 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
13f70 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
13f80 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
13f90 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
13fa0 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
13fb0 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
13fc0 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
13fd0 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
13fe0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
13ff0 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
14000 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20    unsigned *a = 
14010 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  pIdx->aiRowEst;.
14020 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
14030 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30  t( a!=0 );.  a[0
14040 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66  ] = 1000000;.  f
14050 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(i=pIdx->nColu
14060 6d 6e 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a  mn; i>=1; i--){.
14070 20 20 20 20 61 5b 69 5d 20 3d 20 31 30 3b 0a 20      a[i] = 10;. 
14080 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
14090 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
140a0 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e  ){.    a[pIdx->n
140b0 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d  Column] = 1;.  }
140c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
140d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
140e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
140f0 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
14100 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
14110 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
14120 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
14130 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
14140 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
14150 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
14160 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
14170 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
14180 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
14190 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
141a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
141b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
141c0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64  rr || sqlite3Tsd
141d0 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
141e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
141f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
14200 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
14210 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
14220 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
14230 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
14240 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
14250 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14260 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
14270 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
14280 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
14290 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
142a0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
142b0 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
142c0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
142d0 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
142e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
142f0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
14300 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
14310 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
14320 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
14330 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
14340 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14350 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
14360 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
14370 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
14380 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14390 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
143a0 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
143b0 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
143c0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
143d0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
143e0 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
143f0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14400 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
14410 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14420 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
14430 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
14440 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
14450 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
14460 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
14470 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
14480 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
14490 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a  b[pIndex->iDb].z
144a0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
144b0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
144c0 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78  EMA_TABLE(pIndex
144d0 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  ->iDb);.    if( 
144e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
144f0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14500 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
14510 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
14520 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
14530 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
14540 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14550 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29  && pIndex->iDb )
14560 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14570 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
14580 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
14590 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
145a0 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
145b0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
145c0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
145d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
145e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
145f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
14600 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
14610 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
14620 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
14630 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
14640 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14650 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14660 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44   v ){.    int iD
14670 62 20 3d 20 70 49 6e 64 65 78 2d 3e 69 44 62 3b  b = pIndex->iDb;
14680 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
14690 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
146a0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
146b0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
146c0 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
146d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
146e0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
146f0 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70  E(iDb),.       p
14700 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
14710 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
14720 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
14730 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  v, iDb);.    des
14740 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
14750 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
14760 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
14770 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
14780 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
14790 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
147a0 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
147b0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
147c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
147d0 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
147e0 2f 2a 0a 2a 2a 20 70 70 41 72 72 61 79 20 70 6f  /*.** ppArray po
147f0 69 6e 74 73 20 69 6e 74 6f 20 61 20 73 74 72 75  ints into a stru
14800 63 74 75 72 65 20 77 68 65 72 65 20 74 68 65 72  cture where ther
14810 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 70 6f  e is an array po
14820 69 6e 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65  inter.** followe
14830 64 20 62 79 20 74 77 6f 20 69 6e 74 65 67 65 72  d by two integer
14840 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  s. The first int
14850 65 67 65 72 20 69 73 20 74 68 65 0a 2a 2a 20 6e  eger is the.** n
14860 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
14870 73 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  s in the structu
14880 72 65 20 61 72 72 61 79 2e 20 20 54 68 65 20 73  re array.  The s
14890 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 0a 2a 2a  econd integer.**
148a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
148b0 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  f allocated slot
148c0 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a  s in the array..
148d0 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
148e0 6f 72 64 73 2c 20 74 68 65 20 73 74 72 75 63 74  ords, the struct
148f0 75 72 65 20 6c 6f 6f 6b 73 20 73 6f 6d 65 74 68  ure looks someth
14900 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ing like this:.*
14910 2a 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 72 75  *.**        stru
14920 63 74 20 45 78 61 6d 70 6c 65 31 20 7b 0a 2a 2a  ct Example1 {.**
14930 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
14940 20 73 75 62 45 6c 65 6d 20 2a 61 45 6e 74 72 79   subElem *aEntry
14950 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  ;.**          in
14960 74 20 6e 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20  t nEntry;.**    
14970 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63        int nAlloc
14980 3b 0a 2a 2a 20 20 20 20 20 20 20 20 7d 0a 2a 2a  ;.**        }.**
14990 0a 2a 2a 20 54 68 65 20 70 6e 45 6e 74 72 79 20  .** The pnEntry 
149a0 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73  parameter points
149b0 20 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65   to the equivale
149c0 6e 74 20 6f 66 20 45 78 61 6d 70 6c 65 31 2e 6e  nt of Example1.n
149d0 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Entry..**.** Thi
149e0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
149f0 74 65 73 20 61 20 6e 65 77 20 73 6c 6f 74 20 69  tes a new slot i
14a00 6e 20 74 68 65 20 61 72 72 61 79 2c 20 7a 65 72  n the array, zer
14a10 6f 73 20 69 74 20 6f 75 74 2c 0a 2a 2a 20 61 6e  os it out,.** an
14a20 64 20 72 65 74 75 72 6e 73 20 69 74 73 20 69 6e  d returns its in
14a30 64 65 78 2e 20 20 49 66 20 6d 61 6c 6c 6f 63 20  dex.  If malloc 
14a40 66 61 69 6c 73 20 61 20 6e 65 67 61 74 69 76 65  fails a negative
14a50 20 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72   number is retur
14a60 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a 45 6e 74  ned..**.** szEnt
14a70 72 79 20 69 73 20 74 68 65 20 73 69 7a 65 6f 66  ry is the sizeof
14a80 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 61 72 72   of a single arr
14a90 61 79 20 65 6e 74 72 79 2e 20 20 69 6e 69 74 53  ay entry.  initS
14aa0 69 7a 65 20 69 73 20 74 68 65 20 0a 2a 2a 20 6e  ize is the .** n
14ab0 75 6d 62 65 72 20 6f 66 20 61 72 72 61 79 20 65  umber of array e
14ac0 6e 74 72 69 65 73 20 61 6c 6c 6f 63 61 74 65 64  ntries allocated
14ad0 20 6f 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20   on the initial 
14ae0 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  allocation..*/.i
14af0 6e 74 20 73 71 6c 69 74 65 33 41 72 72 61 79 41  nt sqlite3ArrayA
14b00 6c 6c 6f 63 61 74 65 28 76 6f 69 64 20 2a 2a 70  llocate(void **p
14b10 70 41 72 72 61 79 2c 20 69 6e 74 20 73 7a 45 6e  pArray, int szEn
14b20 74 72 79 2c 20 69 6e 74 20 69 6e 69 74 53 69 7a  try, int initSiz
14b30 65 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a 20  e){.  char *p;. 
14b40 20 69 6e 74 20 2a 61 6e 20 3d 20 28 69 6e 74 2a   int *an = (int*
14b50 29 26 70 70 41 72 72 61 79 5b 31 5d 3b 0a 20 20  )&ppArray[1];.  
14b60 69 66 28 20 61 6e 5b 30 5d 3e 3d 61 6e 5b 31 5d  if( an[0]>=an[1]
14b70 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
14b80 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
14b90 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
14ba0 20 3d 20 61 6e 5b 31 5d 2a 32 20 2b 20 69 6e 69   = an[1]*2 + ini
14bb0 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20  tSize;.    pNew 
14bc0 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
14bd0 2a 70 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a  *ppArray, newSiz
14be0 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  e*szEntry);.    
14bf0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
14c00 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
14c10 20 20 20 20 7d 0a 20 20 20 20 61 6e 5b 31 5d 20      }.    an[1] 
14c20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2a  = newSize;.    *
14c30 70 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a  ppArray = pNew;.
14c40 20 20 7d 0a 20 20 70 20 3d 20 2a 70 70 41 72 72    }.  p = *ppArr
14c50 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 5b  ay;.  memset(&p[
14c60 61 6e 5b 30 5d 2a 73 7a 45 6e 74 72 79 5d 2c 20  an[0]*szEntry], 
14c70 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 72  0, szEntry);.  r
14c80 65 74 75 72 6e 20 61 6e 5b 30 5d 2b 2b 3b 0a 7d  eturn an[0]++;.}
14c90 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
14ca0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
14cb0 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
14cc0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
14cd0 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
14ce0 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
14cf0 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
14d00 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
14d10 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
14d20 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
14d30 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
14d40 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
14d50 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
14d60 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
14d70 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
14d80 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
14d90 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
14da0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
14db0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
14dc0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
14dd0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
14de0 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  i = sqlite3Array
14df0 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a 2a  Allocate((void**
14e00 29 26 70 4c 69 73 74 2d 3e 61 2c 20 73 69 7a 65  )&pList->a, size
14e10 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
14e20 20 35 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29   5);.  if( i<0 )
14e30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
14e40 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
14e50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14e60 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
14e70 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
14e80 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
14e90 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  Token);.  return
14ea0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
14eb0 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
14ec0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14ed0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49  e3IdListDelete(I
14ee0 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
14ef0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
14f00 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
14f10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
14f20 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
14f30 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
14f40 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
14f50 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
14f60 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
14f70 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
14f80 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
14f90 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
14fa0 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
14fb0 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
14fc0 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
14fd0 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
14fe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
14ff0 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
15000 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
15010 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
15020 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
15030 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
15040 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
15050 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
15060 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15070 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
15080 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
15090 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
150a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
150b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
150c0 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
150d0 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
150e0 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
150f0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
15100 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
15110 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
15120 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
15130 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
15140 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
15150 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
15160 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
15170 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
15180 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
15190 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
151a0 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
151b0 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
151c0 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
151d0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
151e0 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
151f0 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
15200 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
15210 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
15220 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
15230 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
15240 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
15250 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
15260 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
15270 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
15280 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
15290 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
152a0 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
152b0 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
152c0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
152d0 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
152e0 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
152f0 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
15300 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
15310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
15320 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
15330 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
15340 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
15350 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
15360 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
15370 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
15380 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
15390 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
153a0 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
153b0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
153c0 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
153d0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
153e0 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
153f0 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
15400 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
15410 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
15420 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
15430 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
15440 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
15450 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
15460 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
15470 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
15480 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
15490 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
154a0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
154b0 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
154c0 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53  ase){.  struct S
154d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
154e0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
154f0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
15500 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
15510 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
15520 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
15530 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
15540 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
15550 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
15560 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
15570 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
15580 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
15590 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
155a0 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
155b0 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
155c0 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
155d0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
155e0 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
155f0 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
15600 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
15610 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
15620 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
15630 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
15640 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
15650 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
15660 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
15670 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
15680 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
15690 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
156a0 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
156b0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
156c0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
156d0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
156e0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
156f0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
15700 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
15710 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
15720 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
15730 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
15740 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
15750 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
15760 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
15770 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
15780 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
15790 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
157a0 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
157b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
157c0 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70  (pDatabase);.  p
157d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
157e0 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72  -1;.  pList->nSr
157f0 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
15800 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
15810 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20  sign cursors to 
15820 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
15830 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
15840 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
15850 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
15860 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
15870 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
15880 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
15890 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
158a0 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
158b0 74 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64 28  t || sqlite3Tsd(
158c0 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  )->mallocFailed)
158d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
158e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
158f0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
15900 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
15910 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
15920 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
15930 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
15940 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
15950 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
15960 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
15970 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
15980 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15990 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
159a0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
159b0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
159c0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
159d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
159e0 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
159f0 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
15a00 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
15a10 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
15a20 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
15a30 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69  te3SrcListAddAli
15a40 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
15a50 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
15a60 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
15a70 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
15a80 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
15a90 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a  pList->nSrc-1].z
15aa0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
15ab0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
15ac0 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ken);.  }.}../*.
15ad0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
15ae0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
15af0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
15b00 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
15b10 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
15b20 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
15b30 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
15b40 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
15b50 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
15b60 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
15b70 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
15b80 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
15b90 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
15ba0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
15bb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
15bc0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
15bd0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
15be0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
15bf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
15c00 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
15c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
15c20 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
15c30 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
15c40 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
15c50 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
15c60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
15c70 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
15c80 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
15c90 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
15ca0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
15cb0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
15cc0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
15cd0 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
15ce0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
15cf0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
15d00 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
15d10 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
15d20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
15d30 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
15d40 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
15d50 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
15d60 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
15d70 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
15d80 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
15d90 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
15da0 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
15db0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
15dc0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
15dd0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15de0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
15df0 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
15e00 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
15e10 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15e20 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15e30 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
15e40 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
15e50 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
15e60 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
15e70 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
15e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15e90 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
15ea0 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
15eb0 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
15ec0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
15ed0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15ee0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
15ef0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
15f00 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
15f10 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
15f20 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
15f30 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
15f40 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
15f50 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
15f60 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
15f70 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
15f80 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
15f90 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
15fa0 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
15fb0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
15fc0 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  3Tsd()->mallocFa
15fd0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
15fe0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15ff0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
16000 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
16010 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
16020 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
16030 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16040 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
16050 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
16060 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16070 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
16080 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
16090 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
160a0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
160b0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
160c0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
160d0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
160e0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
160f0 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
16100 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
16110 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
16120 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
16130 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
16140 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
16150 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d   sqlite3Tsd()->m
16160 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
16170 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
16180 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16190 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
161a0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
161b0 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
161c0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
161d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
161e0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
161f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16200 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
16210 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
16220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
16230 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
16240 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
16250 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
16260 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
16270 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
16280 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
16290 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
162a0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
162b0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
162c0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  ic int sqlite3Op
162d0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
162e0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
162f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16300 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
16310 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
16320 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
16330 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
16340 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
16350 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
16360 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
16370 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
16380 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
163a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
163b0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
163c0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
163d0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
163e0 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
163f0 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
16400 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
16410 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
16420 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
16430 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
16440 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
16450 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
16460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
16470 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
16480 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
16490 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 1);.      if
164a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
164b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
164c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
164d0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
164e0 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
164f0 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
16500 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
16510 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
16520 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
16530 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
16540 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
16550 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16560 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
16570 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
16580 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
16590 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
165a0 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
165b0 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
165c0 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
165d0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
165e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
165f0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
16600 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
16610 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
16620 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
16630 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
16640 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
16650 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
16660 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
16670 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
16680 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
16690 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
166a0 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
166b0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
166c0 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
166d0 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
166e0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
166f0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
16700 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
16710 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
16720 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
16730 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
16740 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
16750 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
16760 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
16770 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
16780 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
16790 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
167a0 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
167b0 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
167c0 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
167d0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
167e0 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
167f0 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
16800 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
16810 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
16820 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
16830 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
16840 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
16850 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
16860 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
16870 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
16880 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
16890 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
168a0 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
168b0 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
168c0 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
168d0 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
168e0 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
168f0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
16900 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
16910 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
16920 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
16930 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
16940 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
16950 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
16960 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
16970 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
16980 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
16990 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
169a0 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
169b0 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
169c0 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
169d0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
169e0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
169f0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
16a00 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
16a10 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
16a20 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
16a30 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
16a40 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16a50 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
16a60 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
16a70 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
16a80 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
16a90 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
16aa0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16ab0 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
16ac0 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
16ad0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
16ae0 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
16af0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
16b00 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
16b10 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
16b20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
16b30 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
16b40 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
16b50 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
16b60 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
16b70 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20  rt( iDb<32 );.  
16b80 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
16b90 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
16ba0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
16bb0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
16bc0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
16bd0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
16be0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
16bf0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
16c00 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
16c10 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
16c20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
16c30 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
16c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
16c50 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
16c60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
16c70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16c80 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
16c90 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
16ca0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
16cb0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
16cc0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
16cd0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
16ce0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16cf0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
16d00 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
16d10 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
16d20 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
16d30 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
16d40 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
16d50 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
16d60 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
16d70 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
16d80 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
16d90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
16da0 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
16db0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
16dc0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
16dd0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
16de0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
16df0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
16e00 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
16e10 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
16e20 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
16e30 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
16e40 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
16e50 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
16e60 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
16e70 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
16e80 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
16e90 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
16ea0 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
16eb0 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
16ec0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
16ed0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
16ee0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
16ef0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
16f00 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
16f10 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
16f20 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
16f30 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
16f40 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
16f50 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
16f60 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
16f70 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
16f80 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
16f90 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
16fa0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
16fb0 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
16fc0 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
16fd0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
16fe0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
16ff0 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
17000 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
17010 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
17020 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
17030 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
17040 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
17050 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
17060 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
17070 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
17080 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
17090 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
170a0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
170b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
170c0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
170d0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
170e0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
170f0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
17100 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
17110 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
17120 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
17130 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
17140 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17150 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
17160 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
17170 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28   0);.  }.  if( (
17180 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
17190 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65  Db!=1) && pParse
171a0 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
171b0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
171c0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
171d0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
171e0 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
171f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
17200 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
17210 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
17220 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
17230 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
17240 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
17250 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
17260 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
17270 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17280 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
17290 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
172a0 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43  atch(CollSeq *pC
172b0 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
172c0 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ex){.  int n = p
172d0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e  Index->keyInfo.n
172e0 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71  Field;.  CollSeq
172f0 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e   **pp = pIndex->
17300 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20  keyInfo.aColl;. 
17310 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20   while( n-- ){. 
17320 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c     if( *pp==pCol
17330 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
17340 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65    pp++;.  }.  re
17350 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
17360 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
17370 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
17380 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
17390 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
173a0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
173b0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
173c0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
173d0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
173e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
173f0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
17400 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
17410 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
17420 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
17430 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ab, CollSeq *pCo
17440 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
17450 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
17460 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
17470 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
17480 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
17490 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
174a0 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
174b0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
174c0 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d  {.    if( pColl=
174d0 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
174e0 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65  atch(pColl,pInde
174f0 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x) ){.      sqli
17500 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
17510 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
17520 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
17530 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
17540 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
17550 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
17560 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
17570 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
17580 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
17590 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
175a0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
175b0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
175c0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
175d0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
175e0 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
175f0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
17600 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
17610 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
17620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17630 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
17640 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
17650 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
17660 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
17670 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
176a0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
176b0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
176c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
176d0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
176e0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
176f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17700 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
17710 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17720 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
17730 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
17740 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
17750 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
17760 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
17770 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
17780 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
17790 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
177a0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
177b0 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
177c0 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
177d0 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69  +, pDb++){.    i
177e0 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74  f( pDb==0 ) cont
177f0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  inue;.    for(k=
17800 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
17810 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  &pDb->tblHash); 
17820 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
17830 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
17840 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
17850 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
17860 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
17870 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
17880 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, pColl);.    }
17890 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
178a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
178b0 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
178c0 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
178d0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
17900 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
17910 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
17930 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
17940 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
17950 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
17960 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
17970 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
17980 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
17990 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
179a0 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
179b0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
179c0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
179d0 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
179e0 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
179f0 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
17a00 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
17a10 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
17a20 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
17a30 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
17a40 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
17a50 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
17a60 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
17a70 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
17a80 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
17a90 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
17aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
17ab0 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
17ac0 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
17ad0 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
17ae0 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
17af0 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
17b00 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
17b10 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
17b20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
17b30 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
17b40 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
17b70 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
17b80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17b90 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
17ba0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
17bb0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
17bc0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
17bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
17be0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
17bf0 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
17c00 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
17c10 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
17c20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17c30 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
17c40 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
17c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
17c60 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
17c70 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
17c80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17c90 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
17ca0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17cb0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
17cc0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
17cd0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
17ce0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
17cf0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
17d00 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
17d10 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
17d20 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
17d30 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
17d40 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
17d50 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
17d60 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
17d70 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
17d80 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
17d90 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
17da0 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
17db0 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
17dc0 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame1==0 || pName
17dd0 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  1->z==0 ){.    r
17de0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
17df0 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
17e00 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
17e10 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c  if( pName2==0 ||
17e20 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
17e30 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
17e40 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
17e50 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 28 63 68  db, db->enc, (ch
17e60 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  ar*)pName1->z, p
17e70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Name1->n, 0);.  
17e80 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
17e90 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
17ea0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 70 43  bases(pParse, pC
17eb0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
17ec0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
17ed0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
17ee0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
17ef0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
17f00 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
17f10 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
17f20 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
17f30 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f  NameFromToken(pO
17f40 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d  bjName);.  zDb =
17f50 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17f60 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
17f70 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
17f80 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
17f90 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
17fa0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
17fb0 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
17fc0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
17fd0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
17fe0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
17ff0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
18000 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
18010 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20  eFree(z);.  if( 
18020 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
18030 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
18040 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
18050 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
18060 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
18070 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
18080 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
18090 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
180a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
180b0 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
180c0 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
180d0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
180e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.