/ Hex Artifact Content
Login

Artifact 88a441416fb28139fa24fd0fa34288c618c2b3fc:


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 32 20 32 30 30 35 2f 31 32 2f 32 39  1.362 2005/12/29
02f0: 20 30 31 3a 31 31 3a 33 37 20 64 72 68 20 45 78   01:11:37 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 20 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 29 7b 0a 20 20 54  a VIEW */.){.  T
4fc0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
4fd0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
4fe0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
4ff0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
5000: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5010: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
5020: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
5030: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
5040: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f  tabase number to
5050: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
5060: 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  e in */.  Token 
5070: 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e  *pName;    /* Un
5080: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
5090: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63  f the table to c
50a0: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  reate */..  /* T
50b0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
50c0: 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20   name to create 
50d0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
50e0: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
50f0: 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31  kens.  ** pName1
5100: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
5110: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
5120: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
5130: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
5140: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
5150: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
5160: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a  (...);.  ** .  *
5170: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5180: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5190: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
51a0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
51b0: 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61  d if.  ** the ta
51c0: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
51d0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
51e0: 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   i.e.:.  **.  **
51f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
5200: 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a  y(...);.  **.  *
5210: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5220: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
5230: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
5240: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61    **.  ** The ca
5250: 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68  ll below sets th
5260: 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20  e pName pointer 
5270: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5280: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5290: 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  .  ** pName2) th
52a0: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
52b0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
52c0: 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62  name. The variab
52d0: 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73  le iDb is.  ** s
52e0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
52f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5300: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f  that the table o
5310: 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a  r view is to be.
5320: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e    ** created in.
5330: 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
5340: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
5350: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
5360: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
5370: 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
5380: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f  return;.  if( !O
5390: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
53a0: 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b  Temp && iDb>1 ){
53b0: 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74  .    /* If creat
53c0: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
53d0: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
53e0: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20  ot be qualified 
53f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
5400: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5410: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5420: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
5430: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
5440: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
5450: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5460: 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d  & isTemp ) iDb =
5470: 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73   1;..  pParse->s
5480: 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61  NameToken = *pNa
5490: 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  me;.  zName = sq
54a0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
54b0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
54c0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
54d0: 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  rn;.  if( SQLITE
54e0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
54f0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
5500: 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
5510: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5520: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
5530: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  if( db->init.iDb
5540: 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31  ==1 ) isTemp = 1
5550: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5560: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
5570: 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69  ION.  assert( (i
5580: 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65  sTemp & 1)==isTe
5590: 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  mp );.  {.    in
55a0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72  t code;.    char
55b0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
55c0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
55d0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
55e0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
55f0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
5600: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
5610: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
5620: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5630: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
5640: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
5650: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
5660: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5670: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
5680: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5690: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ATE_TEMP_VIEW;. 
56a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
56b0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
56c0: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20  E_CREATE_VIEW;. 
56d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
56e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
56f0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5700: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
5710: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5720: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  TE_TEMP_TABLE;. 
5730: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5740: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5750: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a  E_CREATE_TABLE;.
5760: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5770: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
5780: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
5790: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
57a0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
57b0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
57c0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
57d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
57e0: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
57f0: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
5800: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
5810: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
5820: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
5830: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
5840: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
5850: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5860: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
5870: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  s..  */.  if( SQ
5880: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
5890: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
58a0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
58b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
58c0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
58d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
58e0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d  e(db, zName, db-
58f0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
5900: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29  ;.  if( pTable )
5910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5920: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5930: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
5940: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
5950: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
5960: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
5970: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
5980: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
5990: 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62  e, 0)!=0 && (iDb
59a0: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
59b0: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71  .busy) ){.    sq
59c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
59d0: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
59e0: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
59f0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
5a00: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  e);.    goto beg
5a10: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5a20: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
5a30: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5a40: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
5a50: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
5a60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
5a70: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5a80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5a90: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
5aa0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5ab0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
5ac0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
5ad0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
5ae0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
5af0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
5b00: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
5b10: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  ble->pIndex = 0;
5b20: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d  .  pTable->iDb =
5b30: 20 69 44 62 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   iDb;.  pTable->
5b40: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  nRef = 1;.  if( 
5b50: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5b60: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
5b70: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
5b80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
5b90: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5ba0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
5bb0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
5bc0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
5bd0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
5be0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
5bf0: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
5c00: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
5c10: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
5c20: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5c30: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
5c40: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
5c50: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
5c60: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
5c70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5c80: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
5c90: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
5ca0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
5cb0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5cc0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
5cd0: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  ){.    db->aDb[i
5ce0: 44 62 5d 2e 70 53 65 71 54 61 62 20 3d 20 70 54  Db].pSeqTab = pT
5cf0: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
5d00: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
5d10: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
5d20: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
5d30: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
5d40: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
5d50: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
5d60: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
5d70: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
5d80: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
5d90: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
5da0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
5db0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
5dc0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
5dd0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
5de0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
5df0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
5e00: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
5e10: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
5e20: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
5e30: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
5e40: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
5e50: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
5e60: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
5e70: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
5e80: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
5e90: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5ea0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
5eb0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
5ec0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
5ed0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
5ee0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5ef0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
5f00: 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 73 71 6c  int lbl;.    sql
5f10: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5f20: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5f30: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
5f40: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
5f50: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
5f60: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5f70: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
5f80: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
5f90: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
5fa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5fb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
5fc0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
5fd0: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
5fe0: 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73  t */.    lbl = s
5ff0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6000: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
6010: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6020: 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a  OP_If, 0, lbl);.
6030: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6040: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6050: 65 72 2c 20 31 2c 20 30 29 3b 20 20 20 2f 2a 20  er, 1, 0);   /* 
6060: 66 69 6c 65 20 66 6f 72 6d 61 74 20 64 65 66 61  file format defa
6070: 75 6c 74 73 20 74 6f 20 31 20 2a 2f 0a 20 20 20  ults to 1 */.   
6080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6090: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
60a0: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
60b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
60c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
60d0: 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20  db->enc, 0);.   
60e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
60f0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6100: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
6110: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6120: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6130: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6140: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6150: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6160: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6170: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6180: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6190: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
61a0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
61b0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
61c0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
61d0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
61e0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
61f0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6200: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6210: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6220: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6230: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6240: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6250: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6260: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6270: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6280: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6290: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
62a0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
62b0: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
62c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
62d0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
62e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
62f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6300: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
6310: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
6320: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
6330: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6340: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
6350: 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  Db, 0);.    }.  
6360: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
6370: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29  terTable(v, iDb)
6380: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6390: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
63a0: 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Rowid, 0, 0);.  
63b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
63c0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
63d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
63e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
63f0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
6400: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6410: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
6420: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6430: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6440: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6460: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
6470: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
6480: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
6490: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
64a0: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
64b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64c0: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
64d0: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
64e0: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46  error:.  sqliteF
64f0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
6500: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
6510: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
6520: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f  d to compare two
6530: 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61   strings in a ca
6540: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
6550: 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20  anner..** It is 
6560: 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
6570: 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c  than calling sql
6580: 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69  ite3StrICmp() di
6590: 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70  rectly, but.** p
65a0: 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63  roduces larger c
65b0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  ode..**.** WARNI
65c0: 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  NG: This macro i
65d0: 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65  s not compatible
65e0: 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70   with the strcmp
65f0: 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a  () family. It.**
6600: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
6610: 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73   the two strings
6620: 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65   are equal, othe
6630: 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  rwise false..*/.
6640: 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28  #define STRICMP(
6650: 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33  x, y) (\.sqlite3
6660: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
6670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
6680: 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65  x)]==   \.sqlite
6690: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
66a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
66b0: 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71  (y)]     \.&& sq
66c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29  lite3StrICmp((x)
66d0: 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a  +1,(y)+1)==0 )..
66e0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
66f0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
6700: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
6710: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
6720: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
6730: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
6740: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
6750: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
6760: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
6770: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6780: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
6790: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
67a0: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
67b0: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
67c0: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
67d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
67e0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
67f0: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
6800: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
6810: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6820: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
6830: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6840: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43  ;.  char *z;.  C
6850: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
6860: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
6870: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6880: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
6890: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
68a0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
68b0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
68c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
68d0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
68e0: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
68f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
6900: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6910: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6920: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
6930: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
6940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
6950: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
6960: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
6970: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
6980: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
6990: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
69a0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
69b0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
69c0: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
69d0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
69e0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
69f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6a00: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
6a10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6a20: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
6a30: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
6a40: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
6a50: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
6a60: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
6a70: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
6a80: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
6a90: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
6aa0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
6ab0: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
6ac0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
6ad0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
6ae0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
6af0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
6b00: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
6b10: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
6b20: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
6b30: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
6b40: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
6b50: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
6b60: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
6b70: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
6b80: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
6b90: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
6ba0: 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  oll;.  p->nCol++
6bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6bc0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6bd0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
6be0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
6bf0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
6c00: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
6c10: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
6c20: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
6c30: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
6c40: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
6c50: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
6c60: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
6c70: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
6c80: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
6c90: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6ca0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
6cb0: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
6cc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
6cd0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
6ce0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6cf0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6d00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6d10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6d20: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
6d30: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
6d40: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
6d50: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
6d60: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
6d70: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
6d80: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
6d90: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
6da0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
6db0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
6dc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6dd0: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
6de0: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
6df0: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
6e00: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
6e10: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
6e20: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
6e30: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
6e40: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
6e50: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
6e60: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
6e70: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
6e80: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
6e90: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
6ea0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
6eb0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
6ec0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
6ed0: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
6ee0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
6ef0: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
6f00: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
6f10: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
6f20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
6f30: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
6f40: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
6f70: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
6f80: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
6f90: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
6fa0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
6fb0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
6fc0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
6fd0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
6fe0: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
6ff0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7000: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
7010: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
7020: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
7030: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
7040: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
7050: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7060: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
7070: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7080: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
7090: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
70a0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
70b0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
70c0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
70d0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
70e0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
70f0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
7100: 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e  Type(const Token
7110: 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20   *pType){.  u32 
7120: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
7130: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
7140: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
7150: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7160: 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20  In = pType->z;. 
7170: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7180: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54  char *zEnd = &pT
7190: 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d  ype->z[pType->n]
71a0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21  ;..  while( zIn!
71b0: 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d  =zEnd ){.    h =
71c0: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
71d0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a  3UpperToLower[*z
71e0: 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  In];.    zIn++;.
71f0: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
7200: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
7210: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
7240: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7250: 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20  EXT; .    }else 
7260: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7270: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
7280: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
7290: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
72a0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
72b0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
72c0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
72d0: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
72e0: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
72f0: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
7300: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
7310: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
7320: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7330: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
7340: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
7350: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
7360: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
7370: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
7380: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
7390: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
73a0: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
73b0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
73c0: 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ONE;.#ifndef SQL
73d0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
73e0: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73  G_POINT.    }els
73f0: 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c  e if( h==(('r'<<
7400: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
7410: 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20  a'<<8)+'l')     
7420: 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a       /* REAL */.
7430: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
7440: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7450: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
7460: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
7470: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
7480: 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28   h==(('f'<<24)+(
7490: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
74a0: 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20  )+'a')          
74b0: 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20  /* FLOA */.     
74c0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
74d0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
74e0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
74f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
7500: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7510: 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c  ('d'<<24)+('o'<<
7520: 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27  16)+('u'<<8)+'b'
7530: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f  )          /* DO
7540: 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  UB */.        &&
7550: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
7560: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
7570: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7580: 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a  FF_REAL;.#endif.
7590: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68      }else if( (h
75a0: 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28  &0x00FFFFFF)==((
75b0: 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38  'i'<<16)+('n'<<8
75c0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20  )+'t') ){    /* 
75d0: 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  INT */.      aff
75e0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
75f0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
7600: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
7610: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
7620: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7630: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7640: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7650: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7660: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7670: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7680: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
7690: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
76a0: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
76b0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
76c0: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
76d0: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
76e0: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
76f0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
7700: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
7710: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
7720: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
7730: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
7740: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
7750: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
7760: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
7770: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
7780: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
7790: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
77a0: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
77b0: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
77c0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
77d0: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
77e0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  rse, Token *pTyp
77f0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
7800: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
7810: 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20  n *pCol;..  if( 
7820: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7830: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7840: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
7850: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
7860: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
7870: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
7880: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
7890: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f  l->zType);.  pCo
78a0: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
78b0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
78c0: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
78d0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
78e0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
78f0: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
7900: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7910: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
7920: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
7930: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7940: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
7950: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
7960: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7970: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
7980: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
7990: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
79a0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
79b0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
79c0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
79d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
79e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
79f0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
7a00: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
7a10: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
7a20: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
7a30: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
7a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7a50: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
7a60: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7a70: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
7a80: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
7a90: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
7aa0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7ab0: 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  le)!=0 ){.    pC
7ac0: 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70  ol = &(p->aCol[p
7ad0: 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20  ->nCol-1]);.    
7ae0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
7af0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
7b00: 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  tion(pExpr) ){. 
7b10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7b20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
7b30: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
7b40: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
7b50: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
7b60: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
7b70: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
7b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7b90: 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44  rDelete(pCol->pD
7ba0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
7bb0: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
7bc0: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
7bd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
7be0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
7bf0: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
7c00: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
7c10: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
7c20: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
7c30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
7c40: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
7c50: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
7c60: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
7c70: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
7c80: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
7c90: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7ca0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
7cb0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
7cc0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
7cd0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
7ce0: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
7cf0: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
7d00: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
7d10: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
7d20: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
7d30: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
7d40: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
7d50: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
7d60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
7d70: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
7d80: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
7d90: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
7da0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
7db0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
7dc0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
7dd0: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
7de0: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
7df0: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
7e00: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
7e10: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
7e20: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
7e30: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
7e40: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
7e50: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
7e60: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
7e70: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7e80: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7e90: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
7ea0: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
7eb0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7ec0: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
7ed0: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
7ee0: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
7ef0: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
7f00: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
7f10: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
7f20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7f30: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
7f40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7f50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
7f60: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
7f70: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
7f80: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
7f90: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
7fa0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
7fb0: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
7fc0: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
7fd0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
7fe0: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
7ff0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
8000: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
8010: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
8020: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
8030: 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a  sortOrder     /*
8040: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f   SQLITE_SO_ASC o
8050: 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  r SQLITE_SO_DESC
8060: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
8070: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
8080: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
8090: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
80a0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
80b0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
80c0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
80d0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
80e0: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
80f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8100: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8110: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
8120: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
8130: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
8140: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
8150: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
8160: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
8170: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
8180: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
8190: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
81a0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
81b0: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
81c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
81d0: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
81e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
81f0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
8200: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
8210: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
8220: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
8230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
8240: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
8250: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
8260: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8270: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
8280: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
82a0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
82b0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
82c0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
82d0: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
82e0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
82f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
8300: 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c  ->nExpr>1 ) iCol
8310: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28   = -1;.  }.  if(
8320: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
8330: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
8340: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
8350: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
8360: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79  e;.  }.  if( zTy
8370: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
8380: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
8390: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
83a0: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d    && sortOrder==
83b0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b  SQLITE_SO_ASC ){
83c0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
83d0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
83e0: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45  b->keyConf = onE
83f0: 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e  rror;.    pTab->
8400: 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e  autoInc = autoIn
8410: 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  c;.  }else if( a
8420: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
8430: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
8440: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
8450: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8460: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
8470: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
8480: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
8490: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
84a0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
84b0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
84c0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
84d0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
84e0: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
84f0: 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74  rror, 0, 0, sort
8500: 4f 72 64 65 72 29 3b 0a 20 20 20 20 70 4c 69 73  Order);.    pLis
8510: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
8520: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
8530: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8540: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
8550: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
8560: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
8570: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
8580: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8590: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
85a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
85b0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
85c0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
85d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
85e0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
85f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
8600: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
8610: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
8620: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
8630: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
8640: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8650: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8660: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  e;.  if( pTab ){
8670: 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43  .    /* The CHEC
8680: 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  K expression mus
8690: 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20  t be duplicated 
86a0: 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72  so that tokens r
86b0: 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  efer.    ** to m
86c0: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e  alloced space an
86d0: 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d  d not the (ephem
86e0: 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68  eral) text of th
86f0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20  e CREATE TABLE. 
8700: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
8710: 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  */.    pTab->pCh
8720: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
8730: 72 41 6e 64 28 70 54 61 62 2d 3e 70 43 68 65 63  rAnd(pTab->pChec
8740: 6b 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  k, sqlite3ExprDu
8750: 70 28 70 43 68 65 63 6b 45 78 70 72 29 29 3b 0a  p(pCheckExpr));.
8760: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
8770: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8780: 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f  CheckExpr);.}../
8790: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
87a0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
87b0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
87c0: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
87d0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
87e0: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
87f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8800: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
8810: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
8820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8830: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
8840: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65  Table *p;.  Inde
8850: 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53  x *pIdx;.  CollS
8860: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
8870: 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20   i;..  if( (p = 
8880: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8890: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
88a0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
88b0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
88c0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
88d0: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
88e0: 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f  nType);.  p->aCo
88f0: 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f  l[i].pColl = pCo
8900: 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ll;..  /* If the
8910: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
8920: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
8930: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
8940: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a  TE <type>",.  **
8950: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
8960: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
8970: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
8980: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
8990: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
89a0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
89b0: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
89c0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
89d0: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20  */.  for(pIdx = 
89e0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
89f0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
8a00: 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t){.    assert( 
8a10: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31  pIdx->nColumn==1
8a20: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
8a30: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
8a40: 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f   ) pIdx->keyInfo
8a50: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c  .aColl[0] = pCol
8a60: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
8a70: 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63  Call sqlite3Chec
8a80: 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61  kCollSeq() for a
8a90: 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ll collating seq
8aa0: 75 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64  uences in an ind
8ab0: 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ex,.** in order 
8ac0: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61  to verify that a
8ad0: 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ll the necessary
8ae0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8af0: 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64  nces are.** load
8b00: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8b10: 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c  e3CheckIndexColl
8b20: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
8b30: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
8b40: 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20  .  if( pIdx ){. 
8b50: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
8b60: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
8b70: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
8b80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
8b90: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
8ba0: 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  se, pIdx->keyInf
8bb0: 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20  o.aColl[i]) ){. 
8bc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8bd0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8be0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8c10: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
8c20: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
8c30: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
8c40: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
8c50: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
8c60: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
8c70: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
8c80: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
8c90: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
8ca0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
8cb0: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
8cc0: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
8cd0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
8ce0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
8cf0: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
8d00: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
8d10: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
8d20: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
8d30: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
8d40: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
8d50: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
8d60: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
8d70: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
8d80: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
8d90: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
8da0: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
8db0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
8dc0: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
8dd0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
8de0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
8df0: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
8e00: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
8e10: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
8e20: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
8e30: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
8e40: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8e50: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
8e60: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c   pParse..*/.Coll
8e70: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
8e80: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
8e90: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
8ea0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
8eb0: 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  nName){.  sqlite
8ec0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8ed0: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 64  db;.  u8 enc = d
8ee0: 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69  b->enc;.  u8 ini
8ef0: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
8f00: 2e 62 75 73 79 3b 0a 0a 20 20 43 6f 6c 6c 53 65  .busy;..  CollSe
8f10: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
8f20: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
8f30: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
8f40: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
8f50: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
8f60: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
8f70: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
8f80: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8f90: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c  e3GetCollSeq(db,
8fa0: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e   pColl, zName, n
8fb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
8fc0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  pColl ){.      i
8fd0: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20  f( nName<0 ){.  
8fe0: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74        nName = st
8ff0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
9000: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9010: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9020: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
9030: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
9040: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
9050: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
9060: 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
9070: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
9080: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
9090: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
90a0: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
90b0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
90c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
90d0: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
90e0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
90f0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
9100: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
9110: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
9120: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
9130: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
9140: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
9150: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
9160: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
9170: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
9180: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
9190: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
91a0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
91b0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
91c0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
91d0: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
91e0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
91f0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
9200: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
9210: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
9220: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
9230: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
9240: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
9250: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
9260: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
9270: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
9280: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
9290: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
92a0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
92b0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
92c0: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
92d0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
92e0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
92f0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
9300: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
9310: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
9320: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
9330: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
9340: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
9350: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
9360: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
9370: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
9380: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
9390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
93a0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
93b0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
93c0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
93d0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
93e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
93f0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
9400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
9410: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
9420: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
9430: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
9440: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
9450: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
9460: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9470: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
9480: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
9490: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
94a0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
94b0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
94c0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
94d0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
94e0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
94f0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
9500: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9510: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
9520: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9530: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
9540: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
9550: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
9560: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
9570: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
9580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9590: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
95a0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
95b0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
95c0: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
95d0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
95e0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
95f0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
9600: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
9610: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
9620: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
9630: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
9640: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9650: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
9660: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
9670: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
9680: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
9690: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
96a0: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
96b0: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
96c0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
96d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
96e0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
96f0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
9700: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9720: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
9730: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
9740: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
9750: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
9760: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
9770: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
9780: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
9790: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
97a0: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
97b0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
97c0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
97d0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
97e0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
97f0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
9800: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9810: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9820: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
9830: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
9840: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
9850: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
9860: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
9870: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
9880: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
9890: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
98a0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
98b0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
98c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
98d0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
98e0: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a  Stmt(Table *p){.
98f0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
9900: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
9910: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
9920: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
9930: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9940: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
9950: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
9960: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
9970: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
9980: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
9990: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
99a0: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
99b0: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
99c0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
99d0: 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20  len(z) + 1);.   
99e0: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
99f0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
9a00: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
9a10: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
9a20: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
9a30: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
9a40: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
9a50: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
9a60: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
9a70: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
9a80: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
9a90: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
9aa0: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
9ab0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
9ac0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
9ad0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
9ae0: 72 63 70 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49  rcpy(zStmt, !OMI
9af0: 54 5f 54 45 4d 50 44 42 26 26 70 2d 3e 69 44 62  T_TEMPDB&&p->iDb
9b00: 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45  ==1 ? "CREATE TE
9b10: 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41  MP TABLE ":"CREA
9b20: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
9b30: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
9b40: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
9b50: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
9b60: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
9b70: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
9b80: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
9b90: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
9ba0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  pCol++){.    str
9bb0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
9bc0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
9bd0: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
9be0: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
9bf0: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
9c00: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
9c10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
9c20: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
9c30: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
9c40: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
9c50: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
9c60: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20  zStmt[k], z);.  
9c70: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
9c80: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
9c90: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
9ca0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
9cb0: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
9cc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9cd0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
9ce0: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
9cf0: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
9d00: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
9d10: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
9d20: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
9d30: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
9d40: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
9d50: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
9d60: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
9d70: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
9d80: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
9d90: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
9da0: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
9db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
9dc0: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
9dd0: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
9de0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
9df0: 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20  disk, unless.** 
9e00: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
9e10: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d  ary table or db-
9e20: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20  >init.busy==1.  
9e30: 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75  When db->init.bu
9e40: 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e  sy==1.** it mean
9e50: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
9e60: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
9e70: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
9e80: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
9e90: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
9ea0: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
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 68 61 73 0a 2a 2a 20  er table has.** 
9ed0: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  recently changed
9ee0: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
9ef0: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
9f00: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
9f10: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
9f20: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
9f30: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
9f40: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
9f50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
9f60: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
9f70: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
9f80: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
9f90: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
9fa0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
9fb0: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
9fc0: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
9fd0: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
9fe0: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
9ff0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
a000: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
a010: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
a020: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
a030: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
a040: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
a050: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20  lite3EndTable(. 
a060: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a070: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a080: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
a090: 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20  oken *pCons,    
a0a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c         /* The ',
a0b0: 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68  ' token after th
a0c0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65  e last column de
a0d0: 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  fn. */.  Token *
a0e0: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
a0f0: 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29   /* The final ')
a100: 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43  ' token in the C
a110: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
a120: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
a130: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
a140: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
a150: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
a160: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a170: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
a180: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
a190: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
a1a0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
a1b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
a1c0: 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d   sqlite3Tsd()->m
a1d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
a1e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
a1f0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
a200: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
a210: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
a220: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
a230: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
a240: 65 63 74 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ect );..#ifndef 
a250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
a260: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
a270: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
a280: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
a290: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
a2a0: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
a2b0: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73 53  {.    SrcList sS
a2c0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a2d0: 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72        /* Fake Sr
a2e0: 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73 65  cList for pParse
a2f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20  ->pNewTable */. 
a300: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a310: 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  NC;             
a320: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
a330: 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  xt for pParse->p
a340: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  NewTable */..   
a350: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
a360: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
a370: 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c     memset(&sSrc,
a380: 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29   0, sizeof(sSrc)
a390: 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63  );.    sSrc.nSrc
a3a0: 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61   = 1;.    sSrc.a
a3b0: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a  [0].zName = p->z
a3c0: 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61  Name;.    sSrc.a
a3d0: 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20  [0].pTab = p;.  
a3e0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72    sSrc.a[0].iCur
a3f0: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e  sor = -1;.    sN
a400: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
a410: 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
a420: 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20  ist = &sSrc;.   
a430: 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31   sNC.isCheck = 1
a440: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
a450: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
a460: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63  s(&sNC, p->pChec
a470: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  k) ){.      retu
a480: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
a490: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
a4a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
a4b0: 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  CK) */..  /* If 
a4c0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
a4d0: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
a4e0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
a4f0: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
a500: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
a510: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
a520: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
a530: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
a540: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
a550: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
a560: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
a570: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
a580: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
a590: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
a5a0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
a5b0: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
a5c0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
a5d0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
a5e0: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
a5f0: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
a600: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
a610: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
a620: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
a630: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
a640: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
a650: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
a660: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
a670: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
a680: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
a690: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
a6a0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
a6b0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
a6c0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20   record number. 
a6d0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
a6e0: 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75  table entry shou
a6f0: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e  ld already be on
a700: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
a710: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
a720: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
a730: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
a740: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
a750: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
a760: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
a770: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
a780: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
a790: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
a7a0: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
a7b0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
a7c0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
a7d0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
a7e0: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
a7f0: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
a800: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
a810: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
a820: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
a830: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
a840: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
a850: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
a860: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
a870: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a880: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
a890: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
a8a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a8b0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
a8c0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
a8d0: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
a8e0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
a8f0: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
a900: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
a910: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
a920: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
a930: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
a940: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
a950: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
a960: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
a970: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
a980: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
a990: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
a9a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
a9b0: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
a9c0: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
a9d0: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
a9e0: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
a9f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aa00: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
aa10: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
aa20: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
aa30: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
aa40: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
aa50: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
aa60: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
aa70: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
aa80: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
aa90: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
aaa0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
aab0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
aac0: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
aad0: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
aae0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
aaf0: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
ab00: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
ab10: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
ab20: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
ab30: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
ab40: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
ab50: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
ab60: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
ab70: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
ab80: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
ab90: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
aba0: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
abb0: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
abc0: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
abd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
abe0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
abf0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
ac00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ac10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
ac20: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
ac30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac40: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
ac50: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
ac60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ac70: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
ac80: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
ac90: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
aca0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
acb0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
acc0: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62  pSelect, SRT_Tab
acd0: 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20  le, 1, 0, 0, 0, 
ace0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
acf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ad00: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
ad10: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
ad20: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
ad30: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
ad40: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ad50: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
ad60: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
ad70: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
ad80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ad90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ada0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
adb0: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
adc0: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
add0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
ade0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
adf0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
ae00: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
ae10: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
ae20: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
ae30: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
ae40: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
ae50: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
ae60: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
ae70: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
ae80: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
ae90: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
aea0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
aeb0: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
aec0: 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d  leStmt(p);.    }
aed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
aee0: 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65  pEnd->z - pParse
aef0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b  ->sNameToken.z +
af00: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
af10: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
af20: 28 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73  ("CREATE %s %.*s
af30: 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
af40: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
af50: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .z);.    }..    
af60: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
af70: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
af80: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
af90: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
afa0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
afb0: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
afc0: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
afd0: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
afe0: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
aff0: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
b000: 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20  collected.  The 
b010: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70 72  rowid for the pr
b020: 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a  eallocated.    *
b030: 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e  * slot is the 2n
b040: 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  d item on the st
b050: 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66  ack.  The top of
b060: 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68   the stack is th
b070: 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
b080: 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ge for the new t
b090: 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20  able (or a 0 if 
b0a0: 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29 2e  this is a view).
b0b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
b0c0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
b0d0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
b0e0: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
b0f0: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
b100: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
b110: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
b120: 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20  page=#0, sql=%Q 
b130: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
b140: 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20 20  rowid=#1",.     
b150: 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d   db->aDb[p->iDb]
b160: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
b170: 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20  ABLE(p->iDb),.  
b180: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
b190: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
b1a0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
b1b0: 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
b1c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74    sqliteFree(zSt
b1d0: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
b1e0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
b1f0: 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 23 69   v, p->iDb);..#i
b200: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b210: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
b220: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
b230: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
b240: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
b250: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
b260: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
b270: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
b280: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
b290: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b2a0: 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20   p->autoInc ){. 
b2b0: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
b2c0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b  db->aDb[p->iDb];
b2d0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
b2e0: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
b2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
b300: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
b310: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
b320: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
b330: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
b340: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
b350: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
b360: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
b370: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
b380: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
b390: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
b3a0: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
b3b0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
b3c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
b3d0: 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
b3e0: 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20  Schema, p->iDb, 
b3f0: 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0,.        sqlit
b400: 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e  e3MPrintf("tbl_n
b410: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
b420: 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
b430: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
b440: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
b450: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
b460: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
b470: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
b480: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
b490: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
b4a0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
b4b0: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
b4c0: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20  FKey *pFKey; .  
b4d0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
b4e0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
b4f0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
b500: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
b510: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
b520: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
b530: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
b540: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
b550: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
b560: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
b570: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
b580: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
b590: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
b5a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  turn;.    }.#ifn
b5b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b5c0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
b5d0: 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b  for(pFKey=p->pFK
b5e0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
b5f0: 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f  =pFKey->pNextFro
b600: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
b610: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
b620: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
b630: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
b640: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
b650: 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  nd(&pDb->aFKey, 
b660: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  pFKey->zTo, nTo)
b670: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48  ;.      sqlite3H
b680: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
b690: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
b6a0: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
b6b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b6c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b6d0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
b6e0: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
b6f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
b700: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
b710: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b720: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
b730: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
b740: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 61 73  lect ){.      as
b750: 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
b760: 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
b770: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
b780: 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70 43 6f 6e 73  ns->z==0 ) pCons
b790: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
b7a0: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
b7b0: 20 31 33 20 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20   13 + (pCons->z 
b7c0: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
b7d0: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23  oken.z);.    }.#
b7e0: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
b7f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b800: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
b810: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
b820: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
b830: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
b840: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
b850: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
b860: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
b870: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
b880: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b890: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
b8a0: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
b8b0: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
b8c0: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
b8d0: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
b8e0: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
b8f0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b900: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b910: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
b920: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
b930: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
b940: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
b950: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
b960: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b970: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
b980: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
b990: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
b9a0: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
b9b0: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
b9c0: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
b9d0: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
b9e0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
b9f0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
ba00: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
ba10: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
ba20: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
ba30: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
ba40: 65 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  e;..  if( pParse
ba50: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
ba60: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ba70: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
ba80: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
ba90: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
baa0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
bab0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
bac0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bad0: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
bae0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42  Table(pParse, pB
baf0: 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  egin, pName1, pN
bb00: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29  ame2, isTemp, 1)
bb10: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
bb20: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
bb30: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
bb40: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
bb50: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
bb60: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
bb70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
bb80: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
bb90: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
bba0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
bbb0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
bbc0: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
bbd0: 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69  rse, p->iDb, "vi
bbe0: 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20  ew", pName).    
bbf0: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  && sqlite3FixSel
bc00: 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
bc10: 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ct).  ){.    sql
bc20: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
bc30: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
bc40: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
bc50: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
bc60: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
bc70: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
bc80: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
bc90: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
bca0: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
bcb0: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
bcc0: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
bcd0: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
bce0: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
bcf0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
bd00: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
bd10: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
bd20: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
bd30: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
bd40: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
bd50: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
bd60: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
bd70: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
bd80: 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74  electDup(pSelect
bd90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
bda0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
bdb0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
bdc0: 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
bdd0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
bde0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  n;.  }.  if( !pP
bdf0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
be00: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
be10: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
be20: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
be30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
be40: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
be50: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
be60: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
be70: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
be80: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
be90: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
bea0: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
beb0: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
bec0: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
bed0: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
bee0: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
bef0: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
bf00: 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  = sEnd.z - pBegi
bf10: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  n->z;.  z = (con
bf20: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
bf30: 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  *)pBegin->z;.  w
bf40: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b  hile( n>0 && (z[
bf50: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73  n-1]==';' || iss
bf60: 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b  pace(z[n-1])) ){
bf70: 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
bf80: 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
bf90: 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
bfa0: 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
bfb0: 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
bfc0: 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
bfd0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
bfe0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
bff0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
c000: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
c010: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
c020: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c030: 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EW */..#ifndef S
c040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c050: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
c060: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
c070: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
c080: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
c090: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
c0a0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
c0b0: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
c0c0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
c0d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
c0e0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
c0f0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
c100: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
c110: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
c120: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
c130: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
c140: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
c150: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
c160: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
c170: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
c180: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
c190: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
c1a0: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
c1b0: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
c1c0: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
c1d0: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
c1e0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
c1f0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
c200: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
c210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
c220: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
c230: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
c240: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
c250: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
c260: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
c270: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20  s assigned */.. 
c280: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
c290: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
c2a0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
c2b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
c2c0: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
c2d0: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
c2e0: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
c2f0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
c300: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
c310: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
c320: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
c330: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
c340: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
c350: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
c360: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
c370: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
c380: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
c390: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
c3a0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
c3b0: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
c3c0: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
c3d0: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
c3e0: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
c3f0: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
c400: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
c410: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
c420: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
c430: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
c440: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
c450: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
c460: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
c470: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
c480: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
c490: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
c4a0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
c4b0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
c4c0: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
c4d0: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
c4e0: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28    */.#if 0.  if(
c4f0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
c500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c510: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c520: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
c530: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
c540: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
c550: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c560: 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
c570: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
c580: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
c590: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
c5a0: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
c5b0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
c5c0: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
c5d0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
c5e0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
c5f0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
c600: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
c610: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
c620: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
c630: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
c640: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
c650: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
c660: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
c670: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
c680: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
c690: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
c6a0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
c6b0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
c6c0: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
c6d0: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
c6e0: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
c6f0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
c700: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
c710: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
c720: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
c730: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
c740: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
c750: 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  up(pTable->pSele
c760: 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20  ct);.  if( pSel 
c770: 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  ){.    n = pPars
c780: 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
c790: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
c7a0: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
c7b0: 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
c7c0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
c7d0: 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c 54 61 62   -1;.    pSelTab
c7e0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c7f0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c800: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
c810: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
c820: 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c   n;.    if( pSel
c830: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Tab ){.      ass
c840: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
c850: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
c860: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
c870: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
c880: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
c890: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
c8a0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
c8b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
c8c0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
c8d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
c8e0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
c8f0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 44 62  elTab);.      Db
c900: 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72  SetProperty(pPar
c910: 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e  se->db, pTable->
c920: 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  iDb, DB_UnresetV
c930: 69 65 77 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iews);.    }else
c940: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
c950: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c960: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
c970: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c980: 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d  elete(pSel);.  }
c990: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
c9a0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
c9b0: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
c9c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c9d0: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
c9e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c9f0: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
ca00: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ca10: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
ca20: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
ca30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca40: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
ca50: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
ca60: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
ca70: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
ca80: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
ca90: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
caa0: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
cab0: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
cac0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
cad0: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
cae0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
caf0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
cb00: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
cb10: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
cb20: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
cb30: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
cb40: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
cb50: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
cb60: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
cb70: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
cb80: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
cb90: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
cba0: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
cbb0: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
cbc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cbd0: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
cbe0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
cbf0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
cc00: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
cc10: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
cc20: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
cc30: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
cc40: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
cc50: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
cc60: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
cc70: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
cc80: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
cc90: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
cca0: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
ccb0: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69  ** to iTo..*/.#i
ccc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ccd0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
cce0: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
ccf0: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
cd00: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
cd10: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
cd20: 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72  *pElem;.  .  for
cd30: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
cd40: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c  hFirst(&pDb->tbl
cd50: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
cd60: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
cd70: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
cd80: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
cd90: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
cda0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
cdb0: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
cdc0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
cdd0: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
cde0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
cdf0: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
ce00: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
ce10: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  Db->idxHash); pE
ce20: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
ce30: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
ce40: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
ce50: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
ce60: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
ce70: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
ce80: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
ce90: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
cea0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
ceb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
cec0: 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  t(0);.}.#endif..
ced0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
cee0: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
cef0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
cf00: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
cf10: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
cf20: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
cf30: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
cf40: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
cf50: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
cf60: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
cf70: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
cf80: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
cf90: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
cfa0: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
cfb0: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
cfc0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
cfd0: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
cfe0: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
cff0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
d000: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
d010: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
d020: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
d030: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
d040: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d050: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
d060: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d070: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
d080: 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53   iDb);.#ifndef S
d090: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d0a0: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
d0b0: 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20  stroy pushes an 
d0c0: 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65  integer onto the
d0d0: 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20   stack. If this 
d0e0: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
d0f0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
d100: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
d110: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
d120: 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
d130: 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
d140: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
d150: 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
d160: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d170: 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
d180: 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
d190: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22  **.  ** The "#0"
d1a0: 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
d1b0: 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
d1c0: 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
d1d0: 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
d1e0: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
d1f0: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  f the stack.  Se
d200: 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  e sqlite3Registe
d210: 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  rExpr()..  */.  
d220: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
d230: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
d240: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
d250: 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
d260: 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74  HERE #0 AND root
d270: 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70  page=#0",.     p
d280: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
d290: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
d2a0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
d2b0: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  able);.#endif.}.
d2c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
d2d0: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
d2e0: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
d2f0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
d300: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
d310: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
d320: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d330: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
d340: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
d350: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
d360: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
d370: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
d380: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
d390: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
d3a0: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
d3b0: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
d3c0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
d3d0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
d3e0: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
d3f0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
d400: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
d410: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
d420: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d430: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d440: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d450: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d460: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
d470: 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  num, pTab->iDb);
d480: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
d490: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d4a0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d4b0: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
d4c0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
d4d0: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d  Idx->tnum, pIdx-
d4e0: 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >iDb);.  }.#else
d4f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
d500: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
d510: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
d520: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
d530: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
d540: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
d550: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
d560: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
d570: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
d580: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
d590: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
d5a0: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
d5b0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
d5c0: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
d5d0: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
d5e0: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
d5f0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
d600: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
d610: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
d620: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
d630: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
d640: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
d650: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
d660: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
d670: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
d680: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
d690: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
d6a0: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
d6b0: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
d6c0: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
d6d0: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
d6e0: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
d6f0: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
d700: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
d710: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
d720: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
d730: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
d740: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
d750: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
d760: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
d770: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
d780: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
d790: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
d7a0: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
d7b0: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
d7c0: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
d7d0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
d7e0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d7f0: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
d800: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
d810: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
d820: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
d830: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
d840: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
d850: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
d860: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d870: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d880: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
d890: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
d8a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d8b0: 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  dx->iDb==pTab->i
d8c0: 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Db );.      if( 
d8d0: 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
d8e0: 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
d8f0: 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
d900: 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
d910: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
d920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d930: 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
d940: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d950: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
d960: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
d970: 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  st, pTab->iDb);.
d980: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
d990: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23   iLargest;.  }.#
d9a0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
d9b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d9c0: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
d9d0: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
d9e0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
d9f0: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
da00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
da10: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
da20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
da30: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
da40: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
da50: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
da60: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
da70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
da80: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
da90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
daa0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
dab0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
dac0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
dad0: 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
dae0: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
daf0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73  drop_table;.  as
db00: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
db10: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
db20: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
db30: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
db40: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
db50: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
db60: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
db70: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
db80: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
db90: 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
dba0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
dbb0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
dbc0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
dbd0: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
dbe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
dbf0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
dc00: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
dc10: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
dc20: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
dc30: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
dc40: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
dc50: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
dc60: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  b->iDb);.    con
dc70: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
dc80: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
dc90: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
dca0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
dcb0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
dcc0: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
dcd0: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
dce0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
dcf0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
dd00: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
dd10: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
dd20: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
dd30: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
dd40: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
dd50: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
dd60: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
dd70: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
dd80: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
dd90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
dda0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
ddb0: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
ddc0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
ddd0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
dde0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
ddf0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
de00: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
de10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
de20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
de30: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
de40: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
de50: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
de60: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
de70: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
de80: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
de90: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
dea0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
deb0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
dec0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
ded0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
dee0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
def0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
df00: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54  ->readOnly || pT
df10: 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ab==db->aDb[iDb]
df20: 2e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  .pSeqTab ){.    
df30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
df40: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
df50: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
df60: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
df70: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
df80: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
df90: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
dfa0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
dfb0: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
dfc0: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
dfd0: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
dfe0: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
dff0: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
e000: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
e010: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
e020: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
e030: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e040: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e050: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
e060: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
e070: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e080: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e090: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
e0a0: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
e0b0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
e0c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e0d0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
e0e0: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
e0f0: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
e100: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e110: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e120: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
e130: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e140: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e150: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
e160: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
e170: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
e180: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
e190: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e1a0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
e1b0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
e1c0: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70  .    int iDb = p
e1d0: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62  Tab->iDb;.    Db
e1e0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
e1f0: 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
e200: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
e210: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
e220: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44   iDb);..    /* D
e230: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
e240: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e250: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
e260: 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
e270: 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
e280: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
e290: 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
e2a0: 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
e2b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
e2c0: 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
e2d0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
e2e0: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
e2f0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
e300: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
e310: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e320: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
e330: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
e340: 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20  >iDb==1 );.     
e350: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
e360: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
e370: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
e380: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
e390: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
e3a0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
e3b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
e3c0: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52  CREMENT.    /* R
e3d0: 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
e3e0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
e3f0: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
e400: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
e410: 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
e420: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
e430: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
e440: 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
e450: 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61  dropped.    ** a
e460: 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
e470: 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
e480: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
e490: 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
e4a0: 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72    ** move as a r
e4b0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f  esult of the dro
e4c0: 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e  p (can happen in
e4d0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
e4e0: 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e)..    */.    i
e4f0: 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63  f( pTab->autoInc
e500: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e510: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
e520: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
e530: 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c  LETE FROM %s.sql
e540: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
e550: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
e560: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
e570: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
e580: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
e590: 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
e5a0: 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
e5b0: 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
e5c0: 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
e5d0: 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
e5e0: 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
e5f0: 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
e600: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
e610: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
e620: 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
e630: 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
e640: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
e650: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
e660: 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
e670: 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
e680: 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
e690: 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
e6a0: 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
e6b0: 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
e6c0: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
e6d0: 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
e6e0: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
e6f0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
e700: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
e710: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
e720: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
e730: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
e740: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
e750: 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
e760: 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
e770: 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
e780: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
e790: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
e7a0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e7b0: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
e7c0: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
e7d0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
e7e0: 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
e7f0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
e800: 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
e810: 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
e820: 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
e830: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
e840: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
e850: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
e860: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
e870: 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70  Table, iDb, 0, p
e880: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
e890: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
e8a0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
e8b0: 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
e8c0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
e8d0: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
e8e0: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
e8f0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
e900: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
e910: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e920: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
e930: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
e940: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
e950: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
e960: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
e970: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
e980: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
e990: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
e9a0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
e9b0: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
e9c0: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
e9d0: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
e9e0: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
e9f0: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
ea00: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
ea10: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
ea20: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
ea30: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
ea40: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
ea50: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
ea60: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
ea70: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
ea80: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
ea90: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
eaa0: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
eab0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
eac0: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
ead0: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
eae0: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
eaf0: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
eb00: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
eb10: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
eb20: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
eb30: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
eb40: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
eb50: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
eb60: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
eb70: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
eb80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
eb90: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
eba0: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
ebb0: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
ebc0: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
ebd0: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
ebe0: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
ebf0: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
ec00: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
ec10: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
ec20: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
ec30: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
ec40: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
ec50: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
ec60: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
ec70: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
ec80: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
ec90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
eca0: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
ecb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ecc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ecd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
ece0: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
ecf0: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
ed00: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
ed10: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
ed20: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
ed30: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
ed40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
ed50: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
ed60: 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
ed70: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
ed80: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
ed90: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
eda0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
edb0: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
edc0: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
edd0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
ede0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
edf0: 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
ee00: 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Key = 0;.  Table
ee10: 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
ee20: 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
ee30: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
ee40: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
ee50: 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
ee60: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
ee70: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
ee80: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
ee90: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
eea0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
eeb0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
eec0: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
eed0: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
eee0: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
eef0: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
ef00: 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
ef10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ef20: 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
ef30: 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
ef40: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
ef50: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
ef60: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
ef70: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
ef80: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
ef90: 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
efa0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
efb0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
efc0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
efd0: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
efe0: 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
eff0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
f000: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f010: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
f020: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f030: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
f040: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
f050: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
f060: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
f070: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
f080: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
f090: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
f0a0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
f0b0: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
f0c0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
f0d0: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
f0e0: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
f0f0: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
f100: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
f110: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
f120: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
f130: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
f140: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
f150: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
f160: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
f170: 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
f180: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
f190: 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
f1a0: 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  ==0 ) goto fk_en
f1b0: 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f  d;.  pFKey->pFro
f1c0: 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
f1d0: 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
f1e0: 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
f1f0: 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
f200: 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
f210: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
f220: 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
f230: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
f240: 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
f250: 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
f260: 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
f270: 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
f280: 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
f290: 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
f2a0: 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
f2b0: 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
f2c0: 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
f2d0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
f2e0: 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
f2f0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
f300: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
f310: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
f320: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
f330: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
f340: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
f350: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f360: 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
f370: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
f380: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
f390: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f3a0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
f3b0: 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
f3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f3d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f3e0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
f3f0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
f400: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f410: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
f420: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
f430: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
f440: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
f450: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
f460: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
f470: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
f480: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
f490: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
f4a0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
f4b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
f4c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
f4d0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
f4e0: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
f4f0: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
f500: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
f510: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
f520: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
f530: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
f540: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
f550: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
f560: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
f570: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
f580: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
f590: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
f5a0: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
f5b0: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
f5c0: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
f5d0: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
f5e0: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
f5f0: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
f600: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
f610: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
f620: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
f630: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
f640: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
f650: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
f660: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
f670: 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
f680: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f690: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
f6a0: 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
f6b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
f6c0: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
f6d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
f6e0: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
f6f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f700: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
f710: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
f720: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
f730: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
f740: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
f750: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
f760: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
f770: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
f780: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
f790: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
f7a0: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
f7b0: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
f7c0: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
f7d0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
f7e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
f7f0: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
f800: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
f810: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
f820: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f830: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
f840: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
f850: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
f860: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f870: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
f880: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
f890: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
f8a0: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
f8b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
f8c0: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
f8d0: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
f8e0: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
f8f0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
f900: 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
f910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
f920: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
f930: 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
f940: 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
f950: 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
f960: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
f970: 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
f980: 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
f990: 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
f9a0: 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
f9b0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
f9c0: 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
f9d0: 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
f9e0: 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
f9f0: 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
fa00: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
fa10: 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
fa20: 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ted.  The memory
fa30: 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20   cell specified 
fa40: 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
fa50: 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
fa60: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
fa70: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
fa80: 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
fa90: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
faa0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
fab0: 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
fac0: 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
fad0: 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
fae0: 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
faf0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
fb00: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
fb10: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
fb20: 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
fb30: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
fb40: 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
fb50: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
fb60: 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
fb70: 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
fb80: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
fb90: 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
fba0: 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
fbb0: 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
fbc0: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
fbd0: 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f  e->nTab;       /
fbe0: 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
fbf0: 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
fc00: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
fc10: 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20  rse->nTab+1;    
fc20: 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
fc30: 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
fc40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
fc70: 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
fc80: 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
fcb0: 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  of index */.  Vd
fcc0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fce0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
fcf0: 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
fd00: 6d 61 63 68 69 6e 65 20 2a 2f 0a 0a 23 69 66 6e  machine */..#ifn
fd10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd20: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
fd30: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
fd40: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fd50: 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
fd60: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
fd70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
fd80: 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
fd90: 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  ].zName ) ){.   
fda0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
fdb0: 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
fdc0: 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65   all the require
fdd0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
fde0: 65 6e 63 65 73 20 61 72 65 20 61 76 61 69 6c 61  ences are availa
fdf0: 62 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 72  ble. This.  ** r
fe00: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 76 6f  outine will invo
fe10: 6b 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ke the collation
fe20: 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b  -needed callback
fe30: 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 28 61   if necessary (a
fe40: 6e 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 68  nd.  ** if one h
fe50: 61 73 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  as been register
fe60: 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed)..  */.  if( 
fe70: 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65  sqlite3CheckInde
fe80: 78 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  xCollSeq(pParse,
fe90: 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
fea0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 76  return;.  }..  v
feb0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
fec0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
fed0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
fee0: 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
fef0: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
ff00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ff10: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52  OP_MemLoad, memR
ff20: 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  ootPage, 0);.   
ff30: 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c   tnum = 0;.  }el
ff40: 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
ff50: 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Index->tnum;.   
ff60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ff70: 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  p(v, OP_Clear, t
ff80: 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
ff90: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
ffa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ffb0: 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d  Integer, pIndex-
ffc0: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  >iDb, 0);.  sqli
ffd0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ffe0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
fff0: 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , tnum,.        
10000 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
10010 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  r*)&pIndex->keyI
10020 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
10030 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  ;.  sqlite3OpenT
10040 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76  ableForReading(v
10050 2c 20 69 54 61 62 2c 20 70 54 61 62 29 3b 0a 20  , iTab, pTab);. 
10060 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
10070 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10080 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
10090 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
100a0 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70  ateIndexKey(v, p
100b0 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20  Index, iTab);.  
100c0 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
100d0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
100e0 20 20 20 20 69 6e 74 20 63 75 72 61 64 64 72 20      int curaddr 
100f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10100 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
10110 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75 72   int addr2 = cur
10120 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69  addr+4;.    sqli
10130 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
10140 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61 64  v, curaddr-1, ad
10150 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr2);.    sqlite
10160 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10170 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 30 29  _Rowid, iTab, 0)
10180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10190 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
101a0 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Imm, 1, 0);.    
101b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
101c0 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c  (v, OP_IsUnique,
101d0 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a 20   iIdx, addr2);. 
101e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
101f0 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  3(v, OP_Halt, SQ
10200 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
10210 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20 20   OE_Abort,.     
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10230 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
10240 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
10250 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10260 20 61 73 73 65 72 74 28 20 61 64 64 72 32 3d 3d   assert( addr2==
10270 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10280 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d  ntAddr(v) );.  }
10290 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
102a0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
102b0 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ert, iIdx, 0);. 
102c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102d0 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
102e0 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  ab, addr1+1);.  
102f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10300 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
10310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10320 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
10330 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
10340 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10350 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
10360 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
10370 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
10380 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
10390 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
103a0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
103b0 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
103c0 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
103d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
103e0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
103f0 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
10400 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
10410 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
10420 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
10430 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
10440 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
10450 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
10460 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
10470 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
10480 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
10490 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
104a0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
104b0 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
104c0 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
104d0 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
104e0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
104f0 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
10500 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10510 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
10520 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
10530 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
10540 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
10550 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
10560 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
10570 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
10580 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
10590 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
105a0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
105b0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
105c0 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
105d0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
105e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
105f0 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
10600 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
10610 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
10620 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
10630 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
10640 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
10650 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
10660 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
10670 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
10680 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
10690 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
106a0 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
106b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
106c0 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
106d0 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
106e0 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
106f0 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
10700 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
10710 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
10720 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
10730 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
10740 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
10750 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
10760 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
10770 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
10780 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
10790 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
107a0 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
107b0 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
107c0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
107d0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
107e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
107f0 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
10800 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
10810 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
10820 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
10830 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
10840 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
10850 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
10860 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
10870 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
10880 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
10890 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
108a0 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
108b0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
108c0 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
108d0 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
108e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
108f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
10900 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
10910 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
10920 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
10930 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
10940 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
10950 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
10960 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
10970 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
10980 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
10990 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
109a0 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
109b0 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
109c0 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
109d0 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
109e0 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
109f0 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
10a00 72 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  re. */.  int des
10a10 63 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 2f 2a  cSeen = 0;    /*
10a20 20 43 68 61 6e 67 65 73 20 74 6f 20 74 72 75 65   Changes to true
10a30 20 69 66 20 61 20 44 45 53 43 20 69 73 20 73 65   if a DESC is se
10a40 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  en */.  sqlite3 
10a50 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10a60 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
10a70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10a80 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
10a90 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
10aa0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
10ab0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
10ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10ad0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
10ae0 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
10af0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
10b00 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
10b10 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
10b20 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
10b30 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
10b40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10b50 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
10b60 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
10b70 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
10b80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10b90 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 73  Err || sqlite3Ts
10ba0 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
10bb0 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
10bc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f  eate_index;..  /
10bd0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
10be0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
10bf0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
10c00 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
10c10 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
10c20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
10c30 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
10c40 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
10c50 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
10c60 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
10c70 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
10c80 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
10c90 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
10ca0 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
10cb0 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
10cc0 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
10cd0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
10ce0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
10cf0 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
10d00 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
10d10 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
10d20 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10d30 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
10d40 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
10d50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10d60 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  x;..#ifndef SQLI
10d70 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
10d80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
10d90 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
10da0 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
10db0 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
10dc0 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
10dd0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
10de0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
10df0 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  to 1..    */.   
10e00 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
10e10 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
10e20 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
10e30 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26      if( pName2 &
10e40 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  & pName2->n==0 &
10e50 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
10e60 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
10e70 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  iDb = 1;.    }.#
10e80 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
10e90 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
10ea0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
10eb0 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
10ec0 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
10ed0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
10ee0 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
10ef0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
10f00 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
10f10 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
10f20 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
10f30 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
10f40 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
10f50 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
10f60 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
10f70 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
10f80 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
10f90 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
10fa0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c  ble(pParse, pTbl
10fb0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
10fc0 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
10fd0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
10fe0 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
10ff0 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
11000 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11010 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70    assert( iDb==p
11020 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65  Tab->iDb );.  }e
11030 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11040 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
11050 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
11060 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
11070 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
11080 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
11090 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69  ->aDb[iDb];..  i
110a0 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
110b0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
110c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
110d0 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
110e0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
110f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11100 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
11110 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
11120 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
11130 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
11140 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11150 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
11160 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
11170 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
11180 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
11190 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
111a0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
111b0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
111c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
111d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
111e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
111f0 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
11200 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
11210 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
11220 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
11230 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
11240 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
11250 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
11260 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
11270 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
11280 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
11290 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
112a0 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
112b0 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
112c0 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
112d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
112e0 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
112f0 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
11300 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
11310 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
11320 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
11330 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
11340 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
11350 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
11360 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
11370 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
11380 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
11390 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
113a0 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
113b0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
113c0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
113d0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
113e0 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
113f0 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
11400 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
11410 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
11420 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
11430 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
11440 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e);.    if( SQLI
11450 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
11460 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
11470 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11480 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
11490 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
114a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
114b0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51  ndex;.    if( SQ
114c0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
114d0 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
114e0 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
114f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11500 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
11520 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
11530 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
11540 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
11550 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
11560 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11570 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  e_index;.      i
11580 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
11590 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
115a0 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
115b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
115c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
115d0 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
115e0 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
115f0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
11600 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11610 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
11620 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
11630 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
11640 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
11650 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11660 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
11670 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
11680 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
11690 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
116a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
116b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
116c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
116d0 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
116e0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
116f0 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
11700 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
11710 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
11720 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
11730 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
11740 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
11750 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20  uf,"_%d",n);.   
11760 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
11770 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
11780 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  (&zName, "sqlite
11790 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54  _autoindex_", pT
117a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c  ab->zName, zBuf,
117b0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
117c0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
117d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
117e0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
117f0 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
11800 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
11810 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
11820 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11830 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11840 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
11850 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
11860 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
11870 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11880 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11890 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
118a0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
118b0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
118c0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
118d0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
118e0 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
118f0 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
11900 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
11910 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
11920 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
11930 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
11940 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
11950 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
11960 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
11970 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
11980 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11990 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
119a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
119b0 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
119c0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
119d0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
119e0 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
119f0 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
11a00 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
11a10 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
11a20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
11a30 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
11a40 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
11a50 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
11a60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
11a70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
11a80 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62  Id.z = (u8*)pTab
11a90 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
11aa0 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
11ab0 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
11ac0 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e  n((char*)nullId.
11ad0 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  z);.    pList = 
11ae0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
11af0 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c  ppend(0, 0, &nul
11b00 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  lId);.    if( pL
11b10 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
11b20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11b30 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
11b40 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72  .sortOrder = sor
11b50 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
11b60 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
11b70 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
11b80 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
11b90 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
11ba0 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  me);.  pIndex = 
11bb0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
11bc0 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 6e 4e  zeof(Index) + nN
11bd0 61 6d 65 20 2b 20 32 20 2b 20 73 69 7a 65 6f 66  ame + 2 + sizeof
11be0 28 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20 20  (int) +.        
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 20 2b  (sizeof(int)*2 +
11c10 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a   sizeof(CollSeq*
11c20 29 20 2b 20 31 29 2a 70 4c 69 73 74 2d 3e 6e 45  ) + 1)*pList->nE
11c30 78 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  xpr );.  if( sql
11c40 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
11c50 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  cFailed ) goto e
11c60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11c70 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
11c80 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
11c90 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
11ca0 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oll[pList->nExpr
11cb0 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52  ];.  pIndex->aiR
11cc0 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65  owEst = (unsigne
11cd0 64 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  d*)&pIndex->aiCo
11ce0 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  lumn[pList->nExp
11cf0 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  r];.  pIndex->zN
11d00 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ame = (char*)&pI
11d10 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 70  ndex->aiRowEst[p
11d20 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b 0a  List->nExpr+1];.
11d30 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
11d40 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 26  o.aSortOrder = &
11d50 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e  pIndex->zName[nN
11d60 61 6d 65 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  ame+1];.  strcpy
11d70 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
11d80 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  zName);.  pIndex
11d90 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
11da0 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
11db0 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  mn = pList->nExp
11dc0 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  r;.  pIndex->onE
11dd0 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
11de0 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
11df0 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a  dex = pName==0;.
11e00 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20    pIndex->iDb = 
11e10 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  iDb;..  /* Check
11e20 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
11e30 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
11e40 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
11e50 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
11e60 20 69 66 28 20 70 44 62 2d 3e 66 69 6c 65 5f 66   if( pDb->file_f
11e70 6f 72 6d 61 74 3e 3d 34 20 7c 7c 20 28 21 70 44  ormat>=4 || (!pD
11e80 62 2d 3e 64 65 73 63 49 6e 64 65 78 20 26 26 20  b->descIndex && 
11e90 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
11ea0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
11eb0 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
11ec0 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
11ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
11ee0 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
11ef0 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
11f00 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
11f10 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
11f20 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11f30 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
11f40 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
11f50 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
11f60 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
11f70 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
11f80 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
11f90 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
11fa0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
11fb0 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
11fc0 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69  0, pListItem=pLi
11fd0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
11fe0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73  nExpr; i++, pLis
11ff0 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f  tItem++){.    co
12000 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61  nst char *zColNa
12010 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  me = pListItem->
12020 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d  zName;.    Colum
12030 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20  n *pTabCol;.    
12040 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
12050 74 4f 72 64 65 72 3b 0a 20 20 20 20 66 6f 72 28  tOrder;.    for(
12060 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
12070 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
12080 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
12090 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
120a0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
120b0 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
120c0 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
120d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
120e0 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
120f0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
12100 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12110 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
12120 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
12130 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
12140 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
12150 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
12160 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12170 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
12180 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
12190 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20  i] = j;.    if( 
121a0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
121b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
121c0 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
121d0 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  pr->pColl );.   
121e0 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e     pIndex->keyIn
121f0 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c  fo.aColl[i] = pL
12200 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
12210 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  pColl;.    }else
12220 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
12230 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
12240 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
12250 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .pColl;.    }.  
12260 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
12270 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12280 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64  i] );.    if( !d
12290 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
122a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
122b0 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
122c0 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79  rse, pIndex->key
122d0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a  Info.aColl[i]) .
122e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
122f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12300 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  dex;.    }.    r
12310 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
12320 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
12330 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 44  ortOrder;.    pD
12340 62 2d 3e 64 65 73 63 49 6e 64 65 78 20 7c 3d 20  b->descIndex |= 
12350 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
12360 65 72 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  er;.    requeste
12370 64 53 6f 72 74 4f 72 64 65 72 20 26 3d 20 73 6f  dSortOrder &= so
12380 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
12390 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
123a0 2e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  .aSortOrder[i] =
123b0 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
123c0 64 65 72 3b 0a 20 20 20 20 64 65 73 63 53 65 65  der;.    descSee
123d0 6e 20 7c 3d 20 72 65 71 75 65 73 74 65 64 53 6f  n |= requestedSo
123e0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 70  rtOrder;.  }.  p
123f0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e  Index->keyInfo.n
12400 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e  Field = pList->n
12410 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 44  Expr;.  sqlite3D
12420 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
12430 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
12440 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
12450 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
12460 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
12470 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
12480 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
12490 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
124a0 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
124b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
124c0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
124d0 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
124e0 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
124f0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
12500 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
12510 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
12520 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
12530 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
12540 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
12550 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
12560 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
12570 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
12580 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
12590 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
125a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
125b0 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
125c0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
125d0 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
125e0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
125f0 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
12600 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
12610 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
12620 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
12630 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
12640 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
12650 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
12660 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
12670 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
12680 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
12690 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
126a0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
126b0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
126c0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
126d0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
126e0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
126f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
12700 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
12710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12720 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
12730 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12740 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
12750 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
12760 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
12770 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
12780 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
12790 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
127a0 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
127b0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
127c0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
127d0 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
127e0 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
127f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
12800 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
12810 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  oll[k]!=pIndex->
12820 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d  keyInfo.aColl[k]
12830 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12840 20 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49    if( pIdx->keyI
12850 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 5b 6b  nfo.aSortOrder[k
12860 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  ]!=pIndex->keyIn
12870 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  fo.aSortOrder[k]
12880 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12890 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
128a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
128b0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
128c0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
128d0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
128e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
128f0 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
12900 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
12910 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
12920 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
12930 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
12940 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
12950 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
12960 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
12970 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
12980 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
12990 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
129a0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
129b0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
129c0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
129d0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
129e0 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
129f0 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
12a00 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
12a10 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
12a20 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
12a30 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
12a40 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
12a50 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
12a60 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
12a70 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  our for the inde
12a80 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
12a90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
12aa0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
12ab0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
12ac0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
12ad0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
12ae0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12af0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12b00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12b10 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
12b20 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
12b30 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
12b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
12b50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
12b60 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
12b70 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
12b80 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
12b90 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
12ba0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
12bb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12bc0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12bd0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12be0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
12bf0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
12c00 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
12c10 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
12c20 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
12c30 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
12c40 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
12c50 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
12c60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
12c70 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
12c80 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
12c90 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
12ca0 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69  b[pIndex->iDb].i
12cb0 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
12ce0 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e   strlen(pIndex->
12cf0 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
12d00 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
12d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
12d20 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
12d30 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
12d40 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
12d50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12d60 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12d70 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12d80 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
12d90 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
12da0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
12db0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
12dc0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
12dd0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
12de0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
12df0 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
12e00 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
12e10 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
12e20 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
12e30 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
12e40 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
12e50 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
12e60 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
12e70 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
12e80 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
12e90 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
12ea0 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
12eb0 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
12ec0 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
12ed0 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
12ee0 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
12ef0 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
12f00 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
12f10 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
12f20 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
12f30 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
12f40 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
12f50 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
12f60 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
12f70 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
12f80 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
12f90 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
12fa0 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
12fb0 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
12fc0 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
12fd0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
12fe0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
12ff0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
13000 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
13010 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
13020 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13030 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
13040 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
13050 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
13060 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
13070 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
13080 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
13090 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
130a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
130b0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
130c0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
130d0 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
130e0 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
130f0 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
13100 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
13110 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
13120 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20  >nMem++;..    v 
13130 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13140 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
13150 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
13160 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13170 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
13180 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
13190 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
131a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
131b0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
131c0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
131d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
131e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
131f0 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
13200 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
13210 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
13220 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30  emStore, iMem, 0
13230 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );..    /* Make 
13240 73 75 72 65 20 74 68 65 20 66 69 6c 65 5f 66 6f  sure the file_fo
13250 72 6d 61 74 20 69 73 20 61 74 20 6c 65 61 73 74  rmat is at least
13260 20 34 20 69 66 20 77 65 20 68 61 76 65 20 44 45   4 if we have DE
13270 53 43 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  SC indices. */. 
13280 20 20 20 69 66 28 20 64 65 73 63 53 65 65 6e 20     if( descSeen 
13290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
132a0 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61  MinimumFileForma
132b0 74 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 34  t(pParse, iDb, 4
132c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
132d0 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
132e0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
132f0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
13300 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
13310 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
13320 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
13330 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
13340 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pEnd ){.      /*
13350 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
13360 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
13370 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13380 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
13390 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
133a0 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73  Printf("CREATE%s
133b0 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
133c0 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
133d0 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
133e0 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20  UNIQUE",.       
133f0 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65   pEnd->z - pName
13400 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20  ->z + 1,.       
13410 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
13420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
13430 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
13440 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
13450 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13460 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
13470 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
13480 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
13490 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
134a0 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
134b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
134c0 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
134d0 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
134e0 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
134f0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
13500 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
13510 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
13520 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
13530 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
13540 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  0,%Q);",.       
13550 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
13560 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
13570 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
13580 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
13590 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
135a0 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  me,.        zStm
135b0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
135c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
135d0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
135e0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
135f0 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
13600 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
13610 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
13620 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
13630 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
13640 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
13650 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
13660 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
13670 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
13680 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
13690 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
136a0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
136b0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
136c0 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
136d0 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
136e0 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
136f0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
13700 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
13710 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  b, 0,.         s
13720 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e  qlite3MPrintf("n
13730 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65  ame='%q'", pInde
13740 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59  x->zName), P3_DY
13750 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
13760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13770 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20  , OP_Expire, 0, 
13780 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
13790 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
137a0 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
137b0 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
137c0 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
137d0 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
137e0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
137f0 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
13800 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
13810 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
13820 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
13830 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
13840 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
13850 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20  tion of UPDATE. 
13860 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a   ** and INSERT..
13870 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
13880 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
13890 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
138a0 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
138b0 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
138c0 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
138d0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
138e0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
138f0 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
13900 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
13910 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
13920 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
13930 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
13940 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
13950 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
13960 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
13970 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
13980 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
13990 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
139a0 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
139b0 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
139c0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
139d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
139e0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
139f0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
13a00 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
13a10 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
13a20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
13a30 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
13a40 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
13a50 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
13a60 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
13a70 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49  dex ){.    freeI
13a80 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
13a90 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  }.  sqlite3ExprL
13aa0 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
13ab0 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
13ac0 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d  stDelete(pTblNam
13ad0 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
13ae0 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
13af0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
13b00 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b  rate code to mak
13b10 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  e sure the file 
13b20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73  format number is
13b30 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72   at least minFor
13b40 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65  mat..** The gene
13b50 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20  rated code will 
13b60 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
13b70 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
13b80 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
13b90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e  .void sqlite3Min
13ba0 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50  imumFileFormat(P
13bb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13bc0 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f  t iDb, int minFo
13bd0 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rmat){.  Vdbe *v
13be0 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
13bf0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13c00 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
13c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13c20 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
13c30 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73  , iDb, 1);.    s
13c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13c50 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
13c60 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  inFormat, 0);.  
13c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13c80 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  Op(v, OP_Ge, 0, 
13c90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
13ca0 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
13cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13cc0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
13cd0 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b  , minFormat, 0);
13ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13cf0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
13d00 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a  ookie, iDb, 1);.
13d10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c    }.}../*.** Fil
13d20 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
13d30 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
13d40 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
13d50 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
13d60 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
13d70 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
13d80 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
13d90 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
13da0 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
13db0 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74   suppose to cont
13dc0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
13dd0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
13de0 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
13df0 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
13e00 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
13e10 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
13e20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
13e30 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
13e40 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
13e50 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
13e60 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
13e70 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
13e80 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
13e90 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
13ea0 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
13eb0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
13ec0 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
13ed0 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
13ee0 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69  rticular combini
13ef0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
13f00 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
13f10 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
13f20 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
13f30 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
13f40 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
13f50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
13f60 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
13f70 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
13f80 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
13f90 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
13fa0 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
13fb0 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
13fc0 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
13fd0 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
13fe0 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
13ff0 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
14000 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
14010 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
14020 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
14030 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
14040 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
14050 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
14060 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
14070 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
14080 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61  ){.  unsigned *a
14090 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
140a0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
140b0 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
140c0 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a  a[0] = 1000000;.
140d0 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43    for(i=pIdx->nC
140e0 6f 6c 75 6d 6e 3b 20 69 3e 3d 31 3b 20 69 2d 2d  olumn; i>=1; i--
140f0 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 30  ){.    a[i] = 10
14100 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
14110 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
14120 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
14130 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a  ->nColumn] = 1;.
14140 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
14150 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
14160 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
14170 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
14180 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
14190 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
141a0 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
141b0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
141c0 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
141d0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
141e0 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
141f0 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
14200 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
14210 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14220 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
14230 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
14240 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46  e3Tsd()->mallocF
14250 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
14260 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
14270 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
14280 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
14290 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
142a0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
142b0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
142c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
142d0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
142e0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
142f0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
14300 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
14310 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
14320 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
14330 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
14340 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14350 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
14360 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
14370 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
14380 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
14390 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
143a0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
143b0 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
143c0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
143d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
143e0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
143f0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
14400 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
14410 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
14420 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
14430 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
14440 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
14450 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
14460 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14470 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
14480 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
14490 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
144a0 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
144b0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
144c0 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
144d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
144e0 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  = db->aDb[pIndex
144f0 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
14500 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
14510 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
14520 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  E(pIndex->iDb);.
14530 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
14540 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14550 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
14560 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
14570 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14580 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
14590 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
145a0 5f 54 45 4d 50 44 42 20 26 26 20 70 49 6e 64 65  _TEMPDB && pInde
145b0 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20  x->iDb ) code = 
145c0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
145d0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
145e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
145f0 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
14600 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
14610 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
14620 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14630 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
14640 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14650 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
14660 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
14670 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
14680 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
14690 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
146a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
146b0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
146c0 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e 64    int iDb = pInd
146d0 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c  ex->iDb;.    sql
146e0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
146f0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
14700 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
14710 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  s WHERE name=%Q"
14720 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
14730 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
14740 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
14750 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
14760 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
14770 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14780 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
14790 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
147a0 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
147b0 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
147c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
147d0 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op3(v, OP_DropIn
147e0 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e  dex, iDb, 0, pIn
147f0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
14800 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
14810 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
14820 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
14830 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70  me);.}../*.** pp
14840 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e 74  Array points int
14850 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77 68  o a structure wh
14860 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
14870 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a 2a  array pointer.**
14880 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f   followed by two
14890 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66   integers. The f
148a0 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73 20  irst integer is 
148b0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
148c0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
148d0 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61 79   structure array
148e0 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  .  The second in
148f0 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65 20  teger.** is the 
14900 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61  number of alloca
14910 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68 65  ted slots in the
14920 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e   array..**.** In
14930 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
14940 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b  e structure look
14950 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  s something like
14960 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14970 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d 70      struct Examp
14980 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  le1 {.**        
14990 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65 6d    struct subElem
149a0 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20   *aEntry;.**    
149b0 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79        int nEntry
149c0 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  ;.**          in
149d0 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20  t nAlloc;.**    
149e0 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20      }.**.** The 
149f0 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74 65  pnEntry paramete
14a00 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
14a10 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45 78  equivalent of Ex
14a20 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a  ample1.nEntry..*
14a30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14a40 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  e allocates a ne
14a50 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61 72  w slot in the ar
14a60 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f 75  ray, zeros it ou
14a70 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  t,.** and return
14a80 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49 66  s its index.  If
14a90 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61 20   malloc fails a 
14aa0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
14ab0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
14ac0 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74 68  ** szEntry is th
14ad0 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73 69  e sizeof of a si
14ae0 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72 79  ngle array entry
14af0 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74  .  initSize is t
14b00 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
14b10 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20 61   array entries a
14b20 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20  llocated on the 
14b30 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69  initial allocati
14b40 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
14b50 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
14b60 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c 20  void **ppArray, 
14b70 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e 74  int szEntry, int
14b80 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63 68   initSize){.  ch
14b90 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61 6e  ar *p;.  int *an
14ba0 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72 61   = (int*)&ppArra
14bb0 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b 30  y[1];.  if( an[0
14bc0 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  ]>=an[1] ){.    
14bd0 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20  void *pNew;.    
14be0 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  int newSize;.   
14bf0 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31 5d   newSize = an[1]
14c00 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
14c10 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
14c20 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61 79  Realloc(*ppArray
14c30 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72  , newSize*szEntr
14c40 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
14c50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
14c60 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
14c70 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69 7a    an[1] = newSiz
14c80 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79 20  e;.    *ppArray 
14c90 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20  = pNew;.  }.  p 
14ca0 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d 65  = *ppArray;.  me
14cb0 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a  mset(&p[an[0]*sz
14cc0 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
14cd0 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6e  ry);.  return an
14ce0 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  [0]++;.}../*.** 
14cf0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
14d00 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
14d10 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
14d20 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
14d30 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
14d40 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
14d50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
14d60 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
14d70 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
14d80 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
14d90 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
14da0 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
14db0 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
14dc0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14dd0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
14de0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
14df0 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
14e00 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14e10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
14e20 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
14e30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c 69  ;.  }.  i = sqli
14e40 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
14e50 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74 2d  ((void**)&pList-
14e60 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  >a, sizeof(pList
14e70 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20 69  ->a[0]), 5);.  i
14e80 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
14e90 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
14ea0 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  e(pList);.    re
14eb0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
14ec0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
14ed0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14ee0 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
14ef0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
14f00 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
14f10 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
14f20 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
14f30 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
14f40 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
14f50 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14f60 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14f70 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
14f80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
14f90 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
14fa0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
14fb0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
14fc0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
14fd0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
14fe0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14ff0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
15000 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
15010 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
15020 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
15030 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
15040 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
15050 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
15060 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15070 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
15080 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
15090 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
150a0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
150b0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
150c0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
150d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
150e0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
150f0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
15100 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
15110 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
15120 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
15130 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
15140 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
15150 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
15160 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
15170 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
15180 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
15190 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
151a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
151b0 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
151c0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
151d0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
151e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
151f0 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
15200 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
15210 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
15220 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
15230 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
15240 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
15250 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
15260 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
15270 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
15280 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
15290 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
152a0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
152b0 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
152c0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
152d0 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
152e0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
152f0 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
15300 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
15310 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
15320 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
15330 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
15340 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
15350 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
15360 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
15370 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
15380 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
15390 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
153a0 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
153b0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
153c0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
153d0 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
153e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
153f0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
15400 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,0);.**.** T
15410 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
15420 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
15430 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
15440 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
15450 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
15460 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
15470 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
15480 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
15490 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
154a0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
154b0 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
154c0 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
154d0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
154e0 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c  cListAppend(SrcL
154f0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
15500 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e  n *pTable, Token
15510 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *pDatabase){.  
15520 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
15530 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
15540 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
15550 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
15560 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53  Malloc( sizeof(S
15570 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
15580 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
15590 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
155a0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
155b0 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
155c0 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c  nSrc>=pList->nAl
155d0 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
155e0 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c  st *pNew;.    pL
155f0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32  ist->nAlloc *= 2
15600 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
15610 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
15620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15630 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
15640 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
15650 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
15660 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
15670 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
15680 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
15690 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
156a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
156b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
156c0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
156d0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
156e0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
156f0 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
15700 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
15710 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
15720 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
15730 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
15740 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
15750 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
15760 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
15770 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
15780 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
15790 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
157a0 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
157b0 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
157c0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
157d0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
157e0 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20  Token(pTable);. 
157f0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
15800 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
15810 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61  romToken(pDataba
15820 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
15830 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
15840 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
15850 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
15860 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
15870 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
15880 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
15890 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
158a0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
158b0 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
158c0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
158d0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
158e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
158f0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
15900 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c  ert(pList || sql
15910 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
15920 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
15930 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
15940 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
15950 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
15960 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
15970 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +){.      if( pI
15980 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
15990 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
159a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
159b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
159c0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
159d0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
159e0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
159f0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
15a00 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
15a10 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
15a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
15a40 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
15a50 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
15a60 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
15a70 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
15a80 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
15a90 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69  stAddAlias(SrcLi
15aa0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
15ab0 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
15ac0 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
15ad0 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70  >nSrc>0 ){.    p
15ae0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
15af0 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20  Src-1].zAlias = 
15b00 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
15b10 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20  oken(pToken);.  
15b20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
15b30 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
15b40 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
15b50 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
15b60 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
15b70 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
15b80 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29  (SrcList *pList)
15b90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
15ba0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
15bb0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
15bc0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
15bd0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
15be0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
15bf0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
15c00 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
15c10 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
15c20 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
15c30 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
15c40 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
15c50 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
15c60 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
15c70 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
15c80 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  (0, pItem->pTab)
15c90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
15ca0 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  ectDelete(pItem-
15cb0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
15cc0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15cd0 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  (pItem->pOn);.  
15ce0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
15cf0 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73  elete(pItem->pUs
15d00 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
15d10 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
15d20 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
15d30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
15d40 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
15d50 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
15d60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
15d70 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
15d80 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
15d90 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
15da0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
15db0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
15dc0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
15dd0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
15de0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
15df0 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64 28  r || sqlite3Tsd(
15e00 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
15e10 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15e20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15e30 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15e40 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
15e50 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65  GIN", 0, 0) ) re
15e60 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
15e70 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15e80 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
15e90 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
15ea0 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
15eb0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15ec0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
15ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15ee0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72  beAddOp(v, OP_Tr
15ef0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
15f00 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
15f10 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  E)+1);.    }.  }
15f20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15f30 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
15f40 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
15f50 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
15f60 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
15f70 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
15f80 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
15f90 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
15fa0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
15fb0 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
15fc0 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
15fd0 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
15fe0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
15ff0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
16000 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
16010 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e  | sqlite3Tsd()->
16020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
16030 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
16040 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16050 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
16060 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
16070 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  T", 0, 0) ) retu
16080 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
16090 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
160a0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
160b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
160c0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
160d0 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
160e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
160f0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
16100 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
16110 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
16120 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
16130 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16140 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
16150 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
16160 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
16170 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
16180 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
16190 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
161a0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
161b0 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
161c0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
161d0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
161e0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
161f0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
16200 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
16210 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
16220 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16230 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16240 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
16250 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16260 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
16270 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
16280 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
16290 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
162a0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
162b0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
162c0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
162d0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
162e0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
162f0 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
16300 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
16310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
16320 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
16330 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
16340 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
16350 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16360 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
16370 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
16380 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
16390 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
163a0 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
163b0 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58  ry(db, 0, 0, MAX
163c0 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62  _PAGES, &db->aDb
163d0 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66  [1].pBt);.    if
163e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
163f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16400 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16410 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
16420 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
16430 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
16440 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
16450 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
16460 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
16470 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
16480 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
16490 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
164a0 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f  lags & !db->auto
164b0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
164c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
164d0 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
164e0 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a  aDb[1].pBt, 1);.
164f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16510 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16520 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
16530 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
16540 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
16550 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
16560 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
16570 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50  le");.        pP
16580 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
16590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
165a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
165b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
165c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
165d0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
165e0 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
165f0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
16600 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
16610 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
16620 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
16630 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
16640 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
16650 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
16660 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
16670 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
16680 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
16690 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
166a0 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
166b0 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
166c0 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
166d0 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
166e0 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
166f0 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
16700 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
16710 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
16720 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
16730 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
16740 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
16750 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16760 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
16770 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
16780 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
16790 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
167a0 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
167b0 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
167c0 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
167d0 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
167e0 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
167f0 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
16800 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
16810 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
16820 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
16830 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
16840 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
16850 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
16860 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
16870 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
16880 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
16890 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
168a0 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
168b0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
168c0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
168d0 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
168e0 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
168f0 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
16900 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
16910 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
16920 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
16930 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
16940 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
16950 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
16960 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
16970 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
16980 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
16990 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
169a0 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
169b0 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
169c0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
169d0 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
169e0 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
169f0 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
16a00 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
16a10 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
16a20 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
16a30 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
16a40 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
16a50 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
16a60 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
16a70 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
16a80 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
16a90 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16aa0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16ab0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
16ac0 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
16ad0 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
16ae0 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
16af0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
16b00 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
16b10 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
16b20 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
16b30 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
16b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16b50 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
16b60 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
16b70 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b>=0 ){.    asse
16b80 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
16b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
16ba0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
16bb0 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
16bc0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
16bd0 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d  32 );.    mask =
16be0 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28   1<<iDb;.    if(
16bf0 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65   (pParse->cookie
16c00 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
16c10 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
16c20 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d  >cookieMask |= m
16c30 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ask;.      pPars
16c40 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
16c50 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  Db] = db->aDb[iD
16c60 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
16c70 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
16c80 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
16c90 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
16ca0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
16cb0 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20  abase(pParse);. 
16cc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16ce0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
16cf0 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
16d00 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
16d10 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
16d20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
16d30 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
16d40 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
16d50 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
16d60 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
16d70 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
16d80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
16d90 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
16da0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
16db0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
16dc0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
16dd0 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
16de0 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
16df0 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
16e00 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
16e10 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
16e20 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
16e30 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
16e40 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
16e50 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
16e60 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
16e70 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
16e80 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
16e90 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
16ea0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
16eb0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
16ec0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
16ed0 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
16ee0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
16ef0 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
16f00 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
16f10 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
16f20 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
16f30 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
16f40 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
16f50 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
16f60 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
16f70 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
16f80 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
16f90 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
16fa0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
16fb0 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
16fc0 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
16fd0 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
16fe0 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
16ff0 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
17000 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
17010 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
17020 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
17030 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
17040 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
17050 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
17060 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
17070 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
17080 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
17090 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
170a0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
170b0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
170c0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
170d0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
170e0 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
170f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
17100 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
17110 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
17120 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
17130 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
17140 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
17150 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
17160 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
17170 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
17180 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d  ement && pParse-
17190 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
171a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171b0 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
171c0 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
171d0 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d  .  if( (OMIT_TEM
171e0 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26  PDB || iDb!=1) &
171f0 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  & pParse->db->aD
17200 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
17210 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
17220 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17230 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65  arse, setStateme
17240 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nt, 1);.  }.}../
17250 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
17260 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
17270 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
17280 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
17290 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
172a0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
172b0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
172c0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
172d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
172e0 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
172f0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c  llationMatch(Col
17300 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64  lSeq *pColl, Ind
17310 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
17320 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  nt n = pIndex->k
17330 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20  eyInfo.nField;. 
17340 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20   CollSeq **pp = 
17350 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
17360 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  aColl;.  while( 
17370 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  n-- ){.    if( *
17380 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75  pp==pColl ) retu
17390 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a  rn 1;.    pp++;.
173a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
173b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
173c0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
173d0 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
173e0 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
173f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
17400 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
17410 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
17420 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
17430 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
17440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
17450 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
17460 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
17470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
17480 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c  able *pTab, Coll
17490 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49  Seq *pColl){.  I
174a0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
174b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
174c0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
174d0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
174e0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
174f0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
17500 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
17510 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
17520 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( pColl==0 || co
17530 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f  llationMatch(pCo
17540 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ll,pIndex) ){.  
17550 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
17560 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
17570 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e  Parse, 0, pTab->
17580 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
17590 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
175a0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
175b0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
175c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
175d0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
175e0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
175f0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
17600 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
17610 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
17620 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17630 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
17640 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
17650 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
17660 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
17670 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
17680 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
17690 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
176a0 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
176b0 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
176c0 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44  Seq *pColl){.  D
176d0 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
176e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
176f0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
17700 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
17730 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
17740 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
17750 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
17760 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
17770 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
17780 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
17790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
177a0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
177b0 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
177c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177e0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
177f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
17800 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
17810 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
17820 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
17830 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d  ){.    if( pDb==
17840 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
17850 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
17860 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62  shFirst(&pDb->tb
17870 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
17880 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
17890 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
178a0 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
178b0 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
178c0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
178d0 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c  rse, pTab, pColl
178e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
178f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
17900 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
17910 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
17920 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
17930 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
17960 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
17970 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
17980 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
17990 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
179a0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
179b0 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
179c0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
179d0 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
179e0 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
179f0 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
17a00 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
17a10 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
17a20 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
17a30 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
17a40 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
17a50 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
17a60 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
17a70 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
17a80 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
17a90 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
17aa0 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
17ab0 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
17ac0 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
17ad0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
17ae0 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
17af0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17b00 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
17b10 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
17b20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
17b30 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
17b40 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
17b50 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
17b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
17b70 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
17b80 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
17b90 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
17ba0 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
17bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
17bc0 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
17bd0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
17be0 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
17bf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
17c00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17c10 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
17c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17c30 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
17c40 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
17c50 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c70 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
17c80 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
17c90 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17cb0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
17cc0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
17cd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17ce0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
17cf0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
17d00 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
17d10 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
17d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17d30 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
17d40 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
17d50 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
17d60 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
17d70 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
17d80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
17d90 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
17da0 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
17db0 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
17dc0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
17dd0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
17de0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
17df0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
17e00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
17e10 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
17e20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20  || pName1->z==0 
17e30 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
17e40 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
17e50 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
17e60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
17e70 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d  e2==0 || pName2-
17e80 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  >z==0 ){.    pCo
17e90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
17ea0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e  CollSeq(db, db->
17eb0 65 6e 63 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  enc, (char*)pNam
17ec0 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e  e1->z, pName1->n
17ed0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
17ee0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
17ef0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
17f00 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  arse, pColl);.  
17f10 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
17f20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  }.  }.  iDb = sq
17f30 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17f40 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17f50 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
17f60 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
17f70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
17f80 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17f90 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b  Token(pObjName);
17fa0 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
17fb0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70  [iDb].zName;.  p
17fc0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
17fd0 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
17fe0 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
17ff0 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
18000 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
18010 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
18020 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74 75  ree(z);.    retu
18030 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
18040 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
18050 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
18060 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29  .  sqliteFree(z)
18070 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
18080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
18090 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
180a0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
180b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
180c0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
180d0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
180e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
180f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18100 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
18110 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
18120 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
18130 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
18140 69 66 0a                                         if.