/ Hex Artifact Content
Login

Artifact bb4c9df2583246728167659d401fd75aa3d9997f:


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 34 20 32 30 30 35 2f 31 32 2f 32 39  1.364 2005/12/29
02f0: 20 32 33 3a 33 33 3a 35 34 20 64 72 68 20 45 78   23:33:54 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
05e0: 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
05f0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
0600: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
0610: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0620: 28 20 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ( !pParse->pVdbe
0630: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
0640: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
0650: 4b 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  K && pParse->nEr
0660: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  r ){.      pPars
0670: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
0680: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
0690: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
06a0: 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72  * Begin by gener
06b0: 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69  ating some termi
06c0: 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74  nation code at t
06d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
06e0: 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a  ** vdbe program.
06f0: 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
0700: 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71  se->db;.  v = sq
0710: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0720: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
0730: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0740: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74  AddOp(v, OP_Halt
0750: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
0760: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
0770: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
0780: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
0790: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
07a0: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
07b0: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
07c0: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
07d0: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
07e0: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
07f0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
0800: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
0810: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
0820: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
0830: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
0840: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
0850: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
0860: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
0870: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
0880: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
0890: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
08a0: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
08b0: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
08c0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
08d0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
08e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
08f0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
0900: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
0910: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
0920: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
0930: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
0940: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
0950: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
0960: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
0970: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
0980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0990: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
09a0: 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73  ction, iDb, (mas
09b0: 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74  k & pParse->writ
09c0: 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20  eMask)!=0);.    
09d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
09e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
09f0: 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50  yCookie, iDb, pP
0a00: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
0a10: 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d  e[iDb]);.      }
0a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
0a30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
0a40: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63  to, 0, pParse->c
0a50: 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20  ookieGoto);.    
0a60: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
0a70: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
0a80: 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20   /* Add a No-op 
0a90: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
0aa0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
0ab0: 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  of the compiled 
0ac0: 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  SQL.    ** state
0ad0: 6d 65 6e 74 20 61 73 20 69 74 73 20 50 33 20 61  ment as its P3 a
0ae0: 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64  rgument.  This d
0af0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
0b00: 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  he functionality
0b10: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
0b20: 72 6f 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a  rogram. .    **.
0b30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
0b40: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
0b50: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29   sqlite3_trace()
0b60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
0b70: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
0b80: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50  P_Noop, 0, 0, pP
0b90: 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72  arse->zSql, pPar
0ba0: 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65  se->zTail-pParse
0bb0: 2d 3e 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66 20  ->zSql);.#endif 
0bc0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
0bd0: 52 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20  RACE */.  }...  
0be0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
0bf0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
0c00: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
0c10: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
0c20: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
0c30: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
0c40: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
0c50: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
0c60: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
0c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0c80: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
0c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0ca0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
0cb0: 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73  rse->nVar, pPars
0cc0: 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20  e->nMem+3,.     
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
0cf0: 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  +3, pParse->expl
0d00: 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ain);.    pParse
0d10: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
0d20: 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  NE;.    pParse->
0d30: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b  colNamesSet = 0;
0d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
0d50: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
0d60: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  OK ){.    pParse
0d70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0d80: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ROR;.  }.  pPars
0d90: 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70  e->nTab = 0;.  p
0da0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  Parse->nMem = 0;
0db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20  .  pParse->nSet 
0dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0dd0: 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Var = 0;.  pPars
0de0: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20  e->cookieMask = 
0df0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
0e00: 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a  kieGoto = 0;.}..
0e10: 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61  /*.** Run the pa
0e20: 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65  rser and code ge
0e30: 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76  nerator recursiv
0e40: 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ely in order to 
0e50: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65  generate.** code
0e60: 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61   for the SQL sta
0e70: 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74  tement given ont
0e80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
0e90: 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a   pParse context.
0ea0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
0eb0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
0ec0: 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65    When the parse
0ed0: 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69  r is run recursi
0ee0: 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79  vely.** this way
0ef0: 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48  , the final OP_H
0f00: 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e  alt is not appen
0f10: 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e  ded and other in
0f20: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20  itialization.** 
0f30: 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  and finalization
0f40: 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74   steps are omitt
0f50: 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65  ed because those
0f60: 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79   are handling by
0f70: 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73   the.** outermos
0f80: 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20  t parser..**.** 
0f90: 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69  Not everything i
0fa0: 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69  s nestable.  Thi
0fb0: 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65  s facility is de
0fc0: 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74  signed to permit
0fd0: 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41  .** INSERT, UPDA
0fe0: 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f  TE, and DELETE o
0ff0: 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73  perations agains
1000: 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e  t SQLITE_MASTER.
1010: 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66    Use.** care if
1020: 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74   you decide to t
1030: 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72  ry to use this r
1040: 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20  outine for some 
1050: 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a  other purposes..
1060: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e  */.void sqlite3N
1070: 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65  estedParse(Parse
1080: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1090: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
10a0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
10b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
10c0: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
10d0: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
10e0: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
10f0: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1100: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1110: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1120: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1130: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1140: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1150: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1160: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1170: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1180: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1190: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
11a0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
11b0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
11c0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
11d0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
11e0: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
11f0: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
1200: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
1210: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1220: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
1230: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
1240: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
1250: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
1260: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
1270: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
1280: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
1290: 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Sql, 0);.  sqlit
12a0: 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d  eFree(zSql);.  m
12b0: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
12c0: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
12d0: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
12e0: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
12f0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1300: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1310: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1320: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1330: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1340: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
1350: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
1360: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
1370: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1380: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
1390: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
13a0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
13b0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
13c0: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
13d0: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
13e0: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
13f0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
1400: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
1410: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
1420: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
1430: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
1440: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
1450: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
1460: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
1470: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
1480: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
1490: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
14a0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
14b0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
14c0: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
14d0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
14e0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
14f0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
1500: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
1510: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1520: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
1530: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
1540: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
1550: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
1560: 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30  assert( zName!=0
1570: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64   );.  assert( (d
1580: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1590: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c  E_Initialized) |
15a0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
15b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
15c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
15d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
15e0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
15f0: 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63   : i;   /* Searc
1600: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
1610: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
1620: 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71  atabase!=0 && sq
1630: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61  lite3StrICmp(zDa
1640: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
1650: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
1660: 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71  inue;.    p = sq
1670: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
1680: 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73  b->aDb[j].tblHas
1690: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
16a0: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
16b0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
16c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
16d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
16e0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
16f0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1700: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
1710: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
1720: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
1730: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
1740: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
1750: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
1760: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
1770: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
1780: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
1790: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
17a0: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
17b0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
17c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
17d0: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
17e0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
17f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
1800: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
1810: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
1820: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
1830: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
1840: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
1850: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
1860: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1870: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
1880: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
1890: 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65  ocateTable(Parse
18a0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
18b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
18c0: 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29  st char *zDbase)
18d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20  {.  Table *p;.. 
18e0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
18f0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
1900: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1910: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1920: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
1930: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
1940: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
1950: 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
1960: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1970: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1980: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1990: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
19a0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
19b0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
19c0: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
19d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
19e0: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
19f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a00: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1a10: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
1a20: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
1a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a50: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a60: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
1a70: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
1a80: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1a90: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
1aa0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1ab0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1ac0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1ad0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1ae0: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1af0: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
1b00: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
1b10: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
1b20: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1b30: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
1b40: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
1b50: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1b60: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1b70: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
1b80: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
1b90: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
1ba0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
1bb0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
1bc0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
1bd0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1be0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
1bf0: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
1c00: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
1c10: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
1c20: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
1c30: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
1c40: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
1c50: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
1c60: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
1c70: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
1c80: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
1c90: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
1ca0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1cb0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1cc0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
1cd0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ;.  assert( (db-
1cf0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1d00: 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20  Initialized) || 
1d10: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
1d20: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
1d30: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
1d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1d50: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
1d60: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
1d70: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
1d80: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  */.    if( zDb &
1d90: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1da0: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
1db0: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
1dc0: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
1dd0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
1de0: 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c  >aDb[j].idxHash,
1df0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
1e00: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66  Name)+1);.    if
1e10: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
1e20: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1e30: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68  /*.** Reclaim th
1e40: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  e memory used by
1e50: 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61   an index.*/.sta
1e60: 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64  tic void freeInd
1e70: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
1e80: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43  sqliteFree(p->zC
1e90: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
1ea0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
1eb0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
1ec0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
1ed0: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
1ee0: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
1ef0: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
1f00: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
1f10: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
1f20: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1f30: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ase hash tables 
1f40: 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  but.** it is not
1f50: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
1f60: 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74  he Table that it
1f70: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c   indexes..** Unl
1f80: 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  inking from the 
1f90: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f  Table must be do
1fa0: 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ne by the callin
1fb0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
1fc0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1fd0: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  eDeleteIndex(sql
1fe0: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
1ff0: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
2000: 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  ld;..  assert( d
2010: 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65  b!=0 && p->zName
2020: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
2030: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2040: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
2050: 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a  b].idxHash, p->z
2060: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
2090: 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  +1, 0);.  assert
20a0: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
20b0: 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e  d==p );.  freeIn
20c0: 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dex(p);.}../*.**
20d0: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
20e0: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
20f0: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
2100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
2110: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
2120: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
2130: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
2140: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
2150: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
2160: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
2170: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
2180: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
2190: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
21a0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
21b0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
21c0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
21d0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
21e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
21f0: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
2200: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
2210: 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72  en;..  len = str
2220: 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  len(zIdxName);. 
2230: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
2240: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
2250: 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61 73  >aDb[iDb].idxHas
2260: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e  h, zIdxName, len
2270: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  +1, 0);.  if( pI
2280: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2290: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
22a0: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
22b0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
22c0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
22d0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
22e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22f0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2300: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2310: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2320: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
2330: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
2340: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
2350: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
2360: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
2370: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
2380: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2390: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
23a0: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
23b0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
23c0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
23d0: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
23e0: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
23f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2400: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
2410: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
2420: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
2430: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
2440: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
2450: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
2460: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
2470: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
2480: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
2490: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
24a0: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
24b0: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
24c0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
24d0: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
24e0: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
24f0: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
2500: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
2510: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
2520: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
2530: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
2540: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
2550: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
2560: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
2570: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
2580: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
2590: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
25a0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
25b0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
25c0: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
25d0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
25e0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
25f0: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
2600: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
2610: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
2620: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
2630: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
2640: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2650: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
2660: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
2670: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2680: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
2690: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
26a0: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
26b0: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
26c0: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
26d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
26e0: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
26f0: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2700: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
2710: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2720: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
2730: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
2740: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
2750: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
2760: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2770: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
2780: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2790: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
27a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
27b0: 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72 69  leteTrigger((Tri
27c0: 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73 68  gger*)sqliteHash
27d0: 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20  Data(pElem));.  
27e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
27f0: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
2800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
2810: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
2820: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2830: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
2840: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
2850: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
2860: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
2870: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2880: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
2890: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
28a0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
28b0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
28c0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
28d0: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
28e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
28f0: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
2900: 70 44 62 2d 3e 70 53 65 71 54 61 62 20 3d 20 30  pDb->pSeqTab = 0
2910: 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  ;.    DbClearPro
2920: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
2930: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
2940: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
2950: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
2960: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
2970: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2980: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2990: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
29a0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
29b0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
29c0: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
29d0: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
29e0: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e  then remove then
29f0: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
2a00: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
2a10: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
2a20: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
2a30: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
2a40: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
2a50: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
2a60: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
2a70: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
2a80: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
2a90: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
2aa0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
2ab0: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
2ac0: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2ad0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
2ae0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
2af0: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
2b00: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
2b10: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
2b20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
2b30: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
2b40: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
2b50: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
2b60: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
2b70: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
2b80: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
2b90: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2ba0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
2bb0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2bc0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
2bd0: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
2be0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
2bf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
2c00: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
2c10: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
2c30: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
2c40: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
2c50: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
2c60: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
2c70: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
2c80: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
2c90: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
2ca0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
2cb0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
2cc0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
2cd0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
2ce0: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
2cf0: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
2d00: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
2d10: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
2d20: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
2d30: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
2d40: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
2d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2d60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2d70: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
2d80: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
2d90: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
2da0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
2db0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
2dc0: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
2dd0: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
2de0: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2df0: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
2e00: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
2e10: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
2e20: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
2e30: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
2e40: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
2e50: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2e60: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
2e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
2e80: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2e90: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
2ea0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2eb0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2ec0: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
2ed0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2ee0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
2ef0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
2f00: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
2f10: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
2f20: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2f30: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
2f40: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
2f50: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
2f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f70: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
2f80: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
2f90: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
2fa0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
2fb0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
2fc0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
2fd0: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
2fe0: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
2ff0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
3000: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
3010: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3020: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  eFree(pCol->zNam
3030: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3040: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
3050: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
3060: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
3070: 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20  >zType);.    }. 
3080: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
3090: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
30a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
30b0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
30c0: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
30d0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
30e0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
30f0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3100: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3110: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3120: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3130: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3140: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3150: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3160: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3170: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3180: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3190: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
31a0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
31b0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
31c0: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
31d0: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
31e0: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
31f0: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3200: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3210: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3220: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3230: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3240: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3250: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3260: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
3270: 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f  .** Indices asso
3280: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3290: 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b  table are unlink
32a0: 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22  ed from the "db"
32b0: 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75  .** data structu
32c0: 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20  re if db!=NULL. 
32d0: 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e   If db==NULL, in
32e0: 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74  dices attached t
32f0: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61  o.** the table a
3300: 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20  re deleted, but 
3310: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
3320: 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ey have already 
3330: 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64  been.** unlinked
3340: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3350: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
3360: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
3370: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
3380: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3390: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
33a0: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20  , *pNextFKey;.. 
33b0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
33c0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44   return;..  /* D
33d0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
33e0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
33f0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3400: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
3410: 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  /.  pTable->nRef
3420: 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  --;.  if( pTable
3430: 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
3440: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3450: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52  sert( pTable->nR
3460: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  ef==0 );..  /* D
3470: 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  elete all indice
3480: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3490: 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a  h this table.  *
34a0: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
34b0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
34c0: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
34d0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
34e0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
34f0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
3500: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62  Index->iDb==pTab
3510: 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62  le->iDb || (pTab
3520: 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49  le->iDb==0 && pI
3530: 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b  ndex->iDb==1) );
3540: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
3550: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3560: 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  x);.  }..#ifndef
3570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
3580: 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65  EIGN_KEY.  /* De
3590: 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e  lete all foreign
35a0: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
35b0: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
35c0: 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a  .  The keys.  **
35d0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
35e0: 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b  eady been unlink
35f0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  ed from the db->
3600: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3610: 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b   .  */.  for(pFK
3620: 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79  ey=pTable->pFKey
3630: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
3640: 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70  NextFKey){.    p
3650: 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79  NextFKey = pFKey
3660: 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20  ->pNextFrom;.   
3670: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
3680: 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  >iDb<db->nDb );.
3690: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
36a0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
36b0: 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62  >aDb[pTable->iDb
36c0: 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20  ].aFKey,.       
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
36f0: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
3700: 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a  o)+1)!=pFKey );.
3710: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3720: 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  FKey);.  }.#endi
3730: 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  f..  /* Delete t
3740: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
3750: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
3760: 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c    sqliteResetCol
3770: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29  umnNames(pTable)
3780: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
3790: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
37a0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
37b0: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
37c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
37d0: 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  ete(pTable->pSel
37e0: 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ect);.#ifndef SQ
37f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
3800: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3810: 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68 65  ete(pTable->pChe
3820: 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  ck);.#endif.  sq
3830: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
3840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
3850: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
3860: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3870: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
3880: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
3890: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
38a0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
38b0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
38c0: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
38d0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
38e0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
38f0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3900: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
3910: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
3920: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
3930: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
3940: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
3960: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
3970: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
3980: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
3990: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
39a0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
39b0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
39c0: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
39d0: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
39e0: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61  e, strlen(zTabNa
39f0: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
3a00: 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   p ){.#ifndef SQ
3a10: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3a20: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
3a30: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
3a40: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
3a50: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
3a60: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
3a70: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
3a80: 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48    pF2 = sqlite3H
3a90: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46  ashFind(&pDb->aF
3aa0: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
3ab0: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
3ac0: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
3ad0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
3ae0: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
3af0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
3b00: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
3b10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3b20: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
3b30: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
3b40: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
3b50: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
3b60: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
3b70: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
3b80: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
3b90: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
3ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
3bb0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
3bc0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3bd0: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
3be0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3bf0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3c00: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
3c10: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
3c20: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
3c30: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
3c40: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
3c50: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
3c60: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
3c70: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
3c80: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3c90: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
3ca0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3cb0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
3cc0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3cd0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
3ce0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
3cf0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
3d00: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
3d10: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
3d20: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
3d30: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
3d40: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
3d50: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
3d60: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3d70: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
3d80: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
3d90: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
3da0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
3db0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
3dc0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
3dd0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
3de0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
3df0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
3e00: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
3e10: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
3e20: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3e30: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3e40: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
3e50: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3e60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
3e70: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
3e80: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
3e90: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
3ea0: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
3eb0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
3ec0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
3ed0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
3ee0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
3ef0: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
3f00: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
3f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3f20: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
3f30: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3f40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
3f50: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
3f60: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
3f70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3f80: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
3f90: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
3fa0: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
3fb0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
3fc0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
3fd0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
3fe0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
3ff0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4000: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4010: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4020: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4030: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4040: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4050: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4060: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4070: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4080: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4090: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
40a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
40b0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
40c0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
40d0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
40e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
40f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
4100: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
4110: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
4120: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
4130: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4140: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4150: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4160: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4170: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
4180: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
4190: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
41a0: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
41b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
41c0: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
41d0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
41e0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e     n = strlen(zN
41f0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
4200: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
4210: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
4220: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
4230: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4240: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4250: 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28   ) && n==strlen(
4260: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
4270: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
4280: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
4290: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
42a0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
42b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
42c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
42d0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
42e0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
42f0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
4300: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
4310: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
4320: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
4330: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4340: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4350: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4360: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4370: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4380: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4390: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
43a0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
43b0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
43c0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
43d0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
43e0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
43f0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
4400: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
4410: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
4420: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
4430: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4440: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4450: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4460: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4470: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4480: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
4490: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
44a0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
44b0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
44c0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
44d0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
44e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
44f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
4500: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
4510: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
4520: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
4530: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4540: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4550: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4560: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4570: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4580: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
4590: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
45a0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
45b0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
45c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
45d0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
45e0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
45f0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
4600: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
4610: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
4620: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
4630: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
4640: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4660: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
4670: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
4680: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4690: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
46a0: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
46b0: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
46c0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
46d0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
46e0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
46f0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
4700: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
4710: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
4720: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
4730: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4740: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
4750: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
4760: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
4770: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4780: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4790: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
47a0: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
47b0: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
47c0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
47d0: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
47e0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
47f0: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
4800: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
4810: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4820: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
4830: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
4840: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
4850: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
4860: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
4870: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
4880: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
4890: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
48a0: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
48b0: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
48c0: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
48d0: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
48e0: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
48f0: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
4900: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
4910: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
4920: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
4930: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
4940: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
4950: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
4960: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
4970: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
4980: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4990: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
49a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
49b0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
49c0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
49d0: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
49e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
49f0: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
4a00: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
4a10: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
4a20: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
4a30: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4a40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4a50: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
4a60: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4a70: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
4a80: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4a90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4ab0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4ac0: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
4ad0: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
4ae0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
4af0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
4b00: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
4b10: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
4b20: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
4b30: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
4b40: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
4b50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4b60: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
4b70: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
4b80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
4b90: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
4ba0: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
4bb0: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
4bc0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4bd0: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
4be0: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
4bf0: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
4c00: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4c10: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
4c20: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
4c30: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
4c40: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
4c50: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
4c60: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
4c70: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
4c80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
4c90: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
4ca0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
4cb0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
4cc0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
4cd0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
4ce0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
4cf0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
4d00: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
4d10: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
4d20: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
4d30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4d40: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
4d50: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4d60: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
4d70: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
4d80: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
4d90: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
4da0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
4db0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
4dc0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
4dd0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4de0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4df0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
4e00: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
4e10: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
4e20: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
4e30: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
4e40: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4e50: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
4e60: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
4e70: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
4e80: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
4e90: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4ea0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
4eb0: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
4ec0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
4ed0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
4ee0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
4ef0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4f00: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
4f10: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
4f20: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
4f30: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
4f40: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4f50: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
4f60: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
4f70: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
4f80: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4f90: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
4fa0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
4fb0: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
4fc0: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
4fd0: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
4fe0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
4ff0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
5000: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
5010: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
5020: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
5030: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
5040: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5050: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
5060: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
5070: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5080: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
5090: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
50a0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
50b0: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
50c0: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
50d0: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
50e0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
50f0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
5100: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
5110: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5120: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5130: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
5140: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
5150: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
5160: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5170: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
5180: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5190: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
51a0: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
51b0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
51c0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
51d0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
51e0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
51f0: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
5200: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5210: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5220: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
5230: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5240: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
5250: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5260: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5270: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
5280: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
5290: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
52a0: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
52b0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
52c0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
52d0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
52e0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
52f0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5300: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
5310: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
5320: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
5330: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
5340: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5350: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
5360: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
5370: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
5380: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
5390: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
53a0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
53b0: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
53c0: 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f  rn;.  if( !OMIT_
53d0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
53e0: 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   && iDb>1 ){.   
53f0: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
5400: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
5410: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
5420: 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20  e qualified */. 
5430: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5440: 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70  sg(pParse, "temp
5450: 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  orary table name
5460: 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69   must be unquali
5470: 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  fied");.    retu
5480: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f  rn;.  }.  if( !O
5490: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
54a0: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
54b0: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
54c0: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
54d0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
54e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
54f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
5500: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
5510: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5520: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
5530: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
5540: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
5550: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5560: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5570: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
5580: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
5590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
55a0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
55b0: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
55c0: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
55d0: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
55e0: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
55f0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
5600: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
5610: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5620: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
5630: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
5640: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
5650: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
5660: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5670: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
5680: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
5690: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
56a0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
56b0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
56c0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
56d0: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
56e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
56f0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5700: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
5710: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5720: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
5730: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5740: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5750: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5760: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
5770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5780: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5790: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
57a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
57b0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
57c0: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
57d0: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
57e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
57f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
5810: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
5820: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
5830: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
5840: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
5850: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
5860: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
5870: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
5880: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
5890: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
58a0: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20  .  ** it does.. 
58b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
58c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
58d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
58e0: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
58f0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5900: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
5910: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
5920: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
5930: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
5940: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
5950: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
5960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5970: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5980: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
5990: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
59a0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
59b0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
59c0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  r;.  }.  if( sql
59d0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
59e0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26  , zName, 0)!=0 &
59f0: 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62  & (iDb==0 || !db
5a00: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
5a10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5a20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
5a30: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
5a40: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
5a50: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  , zName);.    go
5a60: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5a70: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
5a80: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
5a90: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
5aa0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
5ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
5ac0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
5ad0: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
5ae0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
5af0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5b00: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
5b10: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
5b20: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
5b30: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
5b40: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
5b50: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
5b60: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
5b70: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
5b80: 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 70 54  >iDb = iDb;.  pT
5b90: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
5ba0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
5bb0: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
5bc0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
5bd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5be0: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
5bf0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
5c00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
5c10: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
5c20: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
5c30: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
5c40: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
5c50: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
5c60: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
5c70: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
5c80: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
5c90: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
5ca0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
5cb0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
5cc0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5cd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
5ce0: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
5cf0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
5d00: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
5d10: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
5d20: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
5d30: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61  >aDb[iDb].pSeqTa
5d40: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
5d50: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
5d60: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
5d70: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5d80: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
5d90: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
5da0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
5db0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
5dc0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
5dd0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
5de0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
5df0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
5e00: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
5e10: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
5e20: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
5e30: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
5e40: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
5e50: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
5e60: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
5e70: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
5e80: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
5e90: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
5ea0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
5eb0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
5ec0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
5ed0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
5ee0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5ef0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
5f00: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
5f10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
5f20: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
5f30: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5f40: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
5f50: 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20  {.    int lbl;. 
5f60: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
5f70: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5f80: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
5f90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
5fa0: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
5fb0: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
5fc0: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
5fd0: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
5fe0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
5ff0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
6000: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6010: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
6020: 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65  b, 1);   /* file
6030: 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c  _format */.    l
6040: 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  bl = sqlite3Vdbe
6050: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6070: 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20  Op(v, OP_If, 0, 
6080: 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lbl);.    sqlite
6090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60a0: 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c 49 54 45  _Integer, SQLITE
60b0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f  _DEFAULT_FILE_FO
60c0: 52 4d 41 54 2c 20 30 29 3b 0a 20 20 20 20 73 71  RMAT, 0);.    sq
60d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
60e0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
60f0: 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  iDb, 1);.    sql
6100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6110: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6120: 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  >enc, 0);.    sq
6130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6140: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6150: 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c  iDb, 4);.    sql
6160: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6170: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20  abel(v, lbl);.. 
6180: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
6190: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
61a0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
61b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
61c0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
61d0: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
61e0: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
61f0: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
6200: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
6210: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
6220: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
6230: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
6240: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
6250: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
6260: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
6270: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
6280: 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  ry is left on th
6290: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
62a0: 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ck..    ** The r
62b0: 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65  owid value is ne
62c0: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
62d0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64   that sqlite3End
62e0: 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a  Table will.    *
62f0: 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  * generate..    
6300: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6310: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
6320: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
6330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6340: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6350: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
6360: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
6370: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6380: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6390: 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c  reateTable, iDb,
63a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
63b0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
63c0: 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20  Table(v, iDb);. 
63d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
63e0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
63f0: 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  id, 0, 0);.    s
6400: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6410: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
6420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
6440: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  l, 0, 0);.    sq
6450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6460: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
6470: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6480: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6490: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
64a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64b0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
64c0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e   0);.  }..  /* N
64d0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
64e0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
64f0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
6500: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
6510: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
6520: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
6530: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  or:.  sqliteFree
6540: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
6550: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
6560: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
6570: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
6580: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
6590: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
65a0: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
65b0: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
65c0: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
65d0: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
65e0: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
65f0: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
6600: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
6610: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
6620: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
6630: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
6640: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
6650: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
6660: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
6670: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
6680: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
6690: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
66a0: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
66b0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
66c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
66d0: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
66e0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
66f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
6700: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
6710: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
6720: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
6730: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
6740: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
6750: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
6760: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
6770: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
6780: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
6790: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
67a0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
67b0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
67c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
67d0: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
67e0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
67f0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
6800: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
6810: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
6820: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
6830: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
6840: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6850: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
6860: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6870: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
6880: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6890: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
68a0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
68b0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
68c0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
68d0: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
68e0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
68f0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
6900: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
6910: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
6920: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
6930: 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61   STRICMP(z, p->a
6940: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b  Col[i].zName) ){
6950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6960: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6970: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
6980: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
6990: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
69a0: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
69b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
69c0: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
69d0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
69e0: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
69f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
6a00: 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70  loc( p->aCol, (p
6a10: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
6a20: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
6a30: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
6a40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
6a50: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  ee(z);.      ret
6a60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
6a70: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
6a80: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
6a90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
6aa0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
6ab0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
6ac0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
6ad0: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
6ae0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
6af0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
6b00: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
6b10: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
6b20: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
6b30: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
6b40: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
6b50: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
6b60: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
6b70: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
6b80: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
6b90: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
6ba0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
6bb0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
6bc0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f  _AFF_NONE;.  pCo
6bd0: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
6be0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
6bf0: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
6c00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6c10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
6c20: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
6c30: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
6c40: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
6c50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6c60: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
6c70: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
6c80: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
6c90: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
6ca0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
6cb0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
6cc0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
6cd0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
6ce0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6cf0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6d00: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
6d10: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
6d20: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
6d30: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6d40: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
6d50: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
6d60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
6d70: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
6d80: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
6d90: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
6da0: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rror;.}../*.** S
6db0: 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  can the column t
6dc0: 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28  ype name zType (
6dd0: 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e  length nType) an
6de0: 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  d return the.** 
6df0: 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e  associated affin
6e00: 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20  ity type..**.** 
6e10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
6e20: 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e  s a case-indepen
6e30: 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a  dent search of z
6e40: 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  Type for the .**
6e50: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
6e60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
6e70: 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68  le. If one of th
6e80: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a  e substrings is.
6e90: 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f  ** found, the co
6ea0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69  rresponding affi
6eb0: 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64  nity is returned
6ec0: 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61  . If zType conta
6ed0: 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ins.** more than
6ee0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
6ef0: 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20  trings, entries 
6f00: 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f  toward the top o
6f10: 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  f .** the table 
6f20: 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46  take priority. F
6f30: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a  or example, if z
6f40: 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54  Type is 'BLOBINT
6f50: 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  ', .** SQLITE_AF
6f60: 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74  F_INTEGER is ret
6f70: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62  urned..**.** Sub
6f80: 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66  string     | Aff
6f90: 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  inity.** -------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e  ---------.** 'IN
6fc0: 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c  T'         | SQL
6fd0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a  ITE_AFF_INTEGER.
6fe0: 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20  ** 'CHAR'       
6ff0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7000: 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20  XT.** 'CLOB'    
7010: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7020: 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20  _TEXT.** 'TEXT' 
7030: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7040: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f  AFF_TEXT.** 'BLO
7050: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7060: 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27  TE_AFF_NONE.** '
7070: 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53  REAL'        | S
7080: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7090: 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20  * 'FLOA'        
70a0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
70b0: 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20  L.** 'DOUB'     
70c0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
70d0: 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  REAL.**.** If no
70e0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
70f0: 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76  ings in the abov
7100: 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e  e table are foun
7110: 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  d,.** SQLITE_AFF
7120: 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75  _NUMERIC is retu
7130: 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  rned..*/.char sq
7140: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
7150: 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70  e(const Token *p
7160: 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20 3d  Type){.  u32 h =
7170: 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d   0;.  char aff =
7180: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
7190: 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  RIC;.  const uns
71a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20  igned char *zIn 
71b0: 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f  = pType->z;.  co
71c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
71d0: 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70 65  r *zEnd = &pType
71e0: 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a  ->z[pType->n];..
71f0: 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45    while( zIn!=zE
7200: 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  nd ){.    h = (h
7210: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70  <<8) + sqlite3Up
7220: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d  perToLower[*zIn]
7230: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
7240: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
7250: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
7260: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
7270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
7280: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
7290: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
72a0: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ; .    }else if(
72b0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
72c0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
72d0: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
72e0: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
72f0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7300: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
7310: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
7320: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
7330: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
7340: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
7350: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7360: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
7370: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7380: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
7390: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
73a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
73b0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
73c0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
73d0: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
73e0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
73f0: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
7400: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
7410: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7420: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
7430: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
7440: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
7450: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
7460: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
7470: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
7480: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
7490: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
74a0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
74b0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
74c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
74d0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
74e0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
74f0: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
7500: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
7510: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
7520: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
7530: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7540: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
7550: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
7560: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
7570: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
7580: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
7590: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
75a0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
75b0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
75c0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
75d0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
75e0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
75f0: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
7600: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
7610: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
7620: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7630: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
7640: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
7650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
7660: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
7670: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7680: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
7690: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
76a0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
76b0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
76c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
76d0: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
76e0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
76f0: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
7700: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
7710: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
7720: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
7730: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
7740: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7750: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
7760: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
7770: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
7780: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
7790: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
77a0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
77b0: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
77c0: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
77d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
77e0: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
77f0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
7800: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
7810: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
7820: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
7830: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
7840: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
7850: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
7860: 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70 20  pCol;..  if( (p 
7870: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7880: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7890: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
78a0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
78b0: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
78c0: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73  &p->aCol[i];.  s
78d0: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
78e0: 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  zType);.  pCol->
78f0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e  zType = sqlite3N
7900: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 79  ameFromToken(pTy
7910: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
7920: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
7930: 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70  ffinityType(pTyp
7940: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
7950: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
7960: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
7970: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
7980: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
7990: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
79a0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
79b0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
79c0: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
79d0: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
79e0: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
79f0: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
7a00: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
7a10: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
7a20: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
7a30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7a40: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
7a50: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
7a60: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
7a70: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7a80: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
7a90: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
7aa0: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
7ab0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7ac0: 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Expr){.  Table *
7ad0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
7ae0: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
7af0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7b00: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
7b10: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
7b20: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
7b30: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
7b40: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
7b50: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
7b60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7b70: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
7b80: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
7b90: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
7ba0: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
7bb0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
7bc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7bd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7be0: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
7bf0: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  );.      pCol->p
7c00: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
7c10: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
7c20: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
7c30: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
7c40: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
7c50: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
7c60: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
7c70: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
7c80: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
7c90: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
7ca0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
7cb0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
7cc0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
7cd0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
7ce0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
7cf0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
7d00: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
7d10: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
7d20: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
7d30: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
7d40: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
7d50: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
7d60: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
7d70: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
7d80: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
7d90: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
7da0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
7db0: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
7dc0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
7dd0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
7de0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
7df0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
7e00: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
7e10: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
7e20: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
7e30: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
7e40: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
7e50: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
7e60: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
7e70: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
7e80: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
7e90: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
7ea0: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
7eb0: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
7ec0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
7ed0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7ee0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
7ef0: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
7f00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7f10: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
7f20: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
7f30: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
7f40: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
7f50: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
7f60: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
7f70: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
7f80: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
7f90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
7fa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7fb0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7fc0: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
7fd0: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
7fe0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
7ff0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8000: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8010: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8020: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8030: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8040: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8050: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
8060: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
8070: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
8080: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
8090: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
80a0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
80b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
80c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
80d0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
80e0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
80f0: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
8100: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
8110: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
8120: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
8130: 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  >hasPrimKey ){. 
8140: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8150: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8160: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
8170: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
8180: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
8190: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
81a0: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
81b0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
81c0: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
81d0: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
81e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
81f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
8200: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
8210: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
8220: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
8230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
8240: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8250: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
8260: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
8270: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
8280: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8290: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
82a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
82b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
82c0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
82d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
82e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
82f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
8300: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
8310: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
8320: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
8330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8340: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
8350: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
8360: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
8370: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8380: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
8390: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
83a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
83b0: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
83c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
83d0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
83e0: 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  R")==0.        &
83f0: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
8400: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
8410: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
8420: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
8430: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
8440: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74  r;.    pTab->aut
8450: 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a  oInc = autoInc;.
8460: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
8470: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
8480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
8490: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
84a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
84b0: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
84c0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
84d0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
84e0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
84f0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
8500: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  f.  }else{.    s
8510: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
8520: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
8530: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
8540: 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64  r, 0, 0, sortOrd
8550: 65 72 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  er);.    pList =
8560: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
8570: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
8580: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8590: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
85a0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
85b0: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
85c0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
85d0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
85e0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
85f0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8600: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
8610: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
8620: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
8630: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8640: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
8650: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
8660: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
8670: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
8680: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
8690: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
86a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
86b0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
86c0: 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65    /* The CHECK e
86d0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
86e0: 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20  e duplicated so 
86f0: 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65  that tokens refe
8700: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c  r.    ** to mall
8710: 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e  oced space and n
8720: 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61  ot the (ephemera
8730: 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  l) text of the C
8740: 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20  REATE TABLE.    
8750: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ** statement */.
8760: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
8770: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
8780: 64 28 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  d(pTab->pCheck, 
8790: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
87a0: 43 68 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d  CheckExpr));.  }
87b0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
87c0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 68 65  3ExprDelete(pChe
87d0: 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ckExpr);.}../*.*
87e0: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
87f0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
8800: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
8810: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
8820: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
8830: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
8840: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8850: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
8860: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
8870: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
8880: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62  nt nType){.  Tab
8890: 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a  le *p;.  Index *
88a0: 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pIdx;.  CollSeq 
88b0: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
88c0: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
88d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
88e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
88f0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20   = p->nCol-1;.. 
8900: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
8910: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
8920: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79  arse, zType, nTy
8930: 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69  pe);.  p->aCol[i
8940: 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ].pColl = pColl;
8950: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f  ..  /* If the co
8960: 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64  lumn is declared
8970: 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d   as "<name> PRIM
8980: 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20  ARY KEY COLLATE 
8990: 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68  <type>",.  ** th
89a0: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
89b0: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
89c0: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
89d0: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a   before the.  **
89e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
89f0: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
8a00: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
8a10: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a   the case..  */.
8a20: 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e    for(pIdx = p->
8a30: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
8a40: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
8a50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
8a60: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
8a70: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61  .    if( pIdx->a
8a80: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20  iColumn[0]==i ) 
8a90: 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
8aa0: 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[0] = pColl;.
8ab0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c    }.}../*.** Cal
8ac0: 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  l sqlite3CheckCo
8ad0: 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20  llSeq() for all 
8ae0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8af0: 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c  ces in an index,
8b00: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
8b10: 76 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  verify that all 
8b20: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
8b30: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8b40: 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e  s are.** loaded.
8b50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
8b60: 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71  heckIndexCollSeq
8b70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8b80: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
8b90: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
8ba0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
8bb0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
8bc0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8bd0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
8be0: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
8bf0: 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
8c00: 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20  Coll[i]) ){.    
8c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c20: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8c30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8c40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8c50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
8c60: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
8c70: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
8c80: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
8c90: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
8ca0: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
8cb0: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
8cc0: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
8cd0: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
8ce0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
8cf0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8d00: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
8d10: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
8d20: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
8d30: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
8d40: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
8d50: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
8d60: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
8d70: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
8d80: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
8d90: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
8da0: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
8db0: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
8dc0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
8dd0: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
8de0: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
8df0: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
8e00: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
8e10: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
8e20: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
8e30: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
8e40: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
8e50: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
8e60: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
8e70: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
8e80: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
8e90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
8ea0: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
8eb0: 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  arse..*/.CollSeq
8ec0: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
8ed0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
8ee0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
8ef0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61   *zName, int nNa
8f00: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
8f10: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8f20: 0a 20 20 75 38 20 65 6e 63 20 3d 20 64 62 2d 3e  .  u8 enc = db->
8f30: 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  enc;.  u8 initbu
8f40: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
8f50: 73 79 3b 0a 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  sy;..  CollSeq *
8f60: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
8f70: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
8f80: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
8f90: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
8fa0: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
8fb0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
8fc0: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
8fd0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
8fe0: 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43  etCollSeq(db, pC
8ff0: 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  oll, zName, nNam
9000: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  e);.    if( !pCo
9010: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
9020: 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20  nName<0 ){.     
9030: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65     nName = strle
9040: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
9050: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
9060: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9070: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
9080: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a  on sequence: %.*
9090: 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65  s", nName, zName
90a0: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  );.      pColl =
90b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
90c0: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
90d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
90e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
90f0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
9100: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
9110: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
9120: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
9130: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
9140: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
9150: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
9160: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
9170: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
9180: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
9190: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
91a0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
91b0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
91c0: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
91d0: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
91e0: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
91f0: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
9200: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9210: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
9220: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
9230: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
9240: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
9250: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
9260: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
9270: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
9280: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
9290: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
92a0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
92b0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
92c0: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
92d0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
92e0: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
92f0: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
9300: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
9310: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
9320: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
9330: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
9340: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
9350: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
9360: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
9370: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
9380: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
9390: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
93a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
93b0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c  ChangeCookie(sql
93c0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
93d0: 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  v, int iDb){.  s
93e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
93f0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
9400: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
9410: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b  ma_cookie+1, 0);
9420: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9430: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
9440: 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a  kie, iDb, 0);.}.
9450: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
9460: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
9470: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
9480: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
9490: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
94a0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
94b0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
94c0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
94d0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
94e0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
94f0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
9500: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
9510: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
9520: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
9530: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
9540: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
9550: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
9560: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
9570: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9580: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
9590: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
95a0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
95b0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
95c0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
95d0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
95e0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
95f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9600: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
9610: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
9620: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
9630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9640: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
9650: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
9660: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
9670: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
9680: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
9690: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
96a0: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
96b0: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
96c0: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20  ;.  i = *pIdx;. 
96d0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
96e0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
96f0: 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65  f( !isalnum(zIde
9700: 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74  nt[j]) && zIdent
9710: 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b  [j]!='_' ) break
9720: 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74  ;.  }.  needQuot
9730: 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  e =  zIdent[j]!=
9740: 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64  0 || isdigit(zId
9750: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
9760: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
9770: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
9780: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
9790: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
97a0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
97b0: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
97c0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
97d0: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
97e0: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
97f0: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
9800: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
9810: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
9820: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
9830: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
9840: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
9850: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
9860: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9870: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
9880: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
9890: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
98a0: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
98b0: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
98c0: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
98d0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
98e0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
98f0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
9900: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
9910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9920: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
9930: 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  t(Table *p){.  i
9940: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
9950: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
9960: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
9970: 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f   *zEnd, *z;.  Co
9980: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
9990: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
99a0: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
99b0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
99c0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
99d0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
99e0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
99f0: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  z = pCol->zType;
9a00: 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  .    if( z ){.  
9a10: 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e      n += (strlen
9a20: 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a  (z) + 1);.    }.
9a30: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
9a40: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
9a50: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a  ;.  if( n<50 ){.
9a60: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
9a70: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
9a80: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
9a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
9aa0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
9ab0: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
9ac0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
9ad0: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
9ae0: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
9af0: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  zStmt = sqliteMa
9b00: 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20  llocRaw( n );.  
9b10: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
9b20: 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70  eturn 0;.  strcp
9b30: 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54  y(zStmt, !OMIT_T
9b40: 45 4d 50 44 42 26 26 70 2d 3e 69 44 62 3d 3d 31  EMPDB&&p->iDb==1
9b50: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
9b60: 54 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20  TABLE ":"CREATE 
9b70: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
9b80: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
9b90: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
9ba0: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
9bb0: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
9bc0: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
9bd0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
9be0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
9bf0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  l++){.    strcpy
9c00: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
9c10: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
9c20: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
9c30: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
9c40: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
9c50: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
9c60: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28  Name);.    if( (
9c70: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  z = pCol->zType)
9c80: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  !=0 ){.      zSt
9c90: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  mt[k++] = ' ';. 
9ca0: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74       strcpy(&zSt
9cb0: 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  mt[k], z);.     
9cc0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
9cd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72  .    }.  }.  str
9ce0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
9cf0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
9d00: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
9d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9d20: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
9d30: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
9d40: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
9d50: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
9d60: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
9d70: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
9d80: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
9d90: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
9da0: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
9db0: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
9dc0: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
9dd0: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
9de0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
9df0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
9e00: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
9e10: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
9e20: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
9e30: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
9e40: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
9e50: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
9e60: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
9e70: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
9e80: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
9e90: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
9ea0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
9eb0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
9ec0: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
9ed0: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
9ee0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
9ef0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
9f00: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
9f10: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
9f20: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
9f30: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
9f40: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
9f50: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
9f60: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
9f70: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
9f80: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
9f90: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
9fa0: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
9fb0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
9fc0: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
9fd0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
9fe0: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
9ff0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
a000: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
a010: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
a020: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
a030: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
a040: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
a050: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
a060: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
a070: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
a080: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
a090: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
a0a0: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
a0b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a0c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
a0d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
a0e0: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
a0f0: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
a100: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
a110: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
a120: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
a130: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
a140: 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74   The final ')' t
a150: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41  oken in the CREA
a160: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65  TE TABLE */.  Se
a170: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
a180: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
a190: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
a1a0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
a1b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
a1c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a1d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
a1e0: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
a1f0: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
a200: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
a210: 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c  lite3Tsd()->mall
a220: 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20  ocFailed ) {.   
a230: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
a240: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a250: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
a260: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
a270: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
a280: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
a290: 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
a2a0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
a2b0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
a2c0: 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
a2d0: 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
a2e0: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
a2f0: 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
a300: 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b     SrcList sSrc;
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69     /* Fake SrcLi
a330: 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  st for pParse->p
a340: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  NewTable */.    
a350: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
a380: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
a390: 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65  Table */..    me
a3a0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
a3b0: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
a3c0: 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c  memset(&sSrc, 0,
a3d0: 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a   sizeof(sSrc));.
a3e0: 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20      sSrc.nSrc = 
a3f0: 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  1;.    sSrc.a[0]
a400: 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  .zName = p->zNam
a410: 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  e;.    sSrc.a[0]
a420: 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73  .pTab = p;.    s
a430: 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  Src.a[0].iCursor
a440: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70   = -1;.    sNC.p
a450: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
a460: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
a470: 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e   = &sSrc;.    sN
a480: 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20  C.isCheck = 1;. 
a490: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
a4a0: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
a4b0: 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20  sNC, p->pCheck) 
a4c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
a4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
a4e0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
a4f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
a500: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
a510: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
a520: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
a530: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
a540: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
a550: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
a560: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
a570: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
a580: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
a590: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
a5a0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
a5b0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
a5c0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
a5d0: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
a5e0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
a5f0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
a600: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
a610: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
a620: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
a630: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
a640: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
a650: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
a660: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
a670: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
a680: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
a690: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
a6a0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
a6b0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
a6c0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
a6d0: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
a6e0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
a6f0: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
a700: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
a710: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
a720: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
a730: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
a740: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
a750: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
a760: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
a770: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
a780: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
a790: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
a7a0: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
a7b0: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
a7c0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
a7d0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
a7e0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
a7f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
a800: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
a810: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
a820: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
a830: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
a840: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
a850: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
a860: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
a870: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
a880: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
a890: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
a8a0: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
a8b0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
a8c0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a8d0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a8e0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
a8f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a900: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
a910: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
a920: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
a930: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
a940: 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20  nd push it onto 
a950: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
a960: 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20  * A view has no 
a970: 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73  rootpage, so jus
a980: 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e  t push a zero on
a990: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72  to the stack for
a9a0: 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20  .    ** views.  
a9b0: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
a9c0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
a9d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
a9e0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
a9f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
aa00: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
aa10: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
aa20: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
aa30: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
aa40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aa50: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
aa60: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
aa70: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
aa80: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
aa90: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
aaa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
aab0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
aac0: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
aad0: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
aae0: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
aaf0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
ab00: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
ab10: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
ab20: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
ab30: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
ab40: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
ab50: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
ab60: 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e   the vdbe stack.
ab70: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
ab80: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
ab90: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
aba0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
abb0: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
abc0: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
abd0: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
abe0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
abf0: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
ac00: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
ac10: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
ac20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
ac30: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54  elect ){.      T
ac40: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
ac50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
ac70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
ac80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ac90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d  , OP_Integer, p-
aca0: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
acb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
acc0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
acd0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
ace0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
acf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
ad00: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
ad10: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
ad20: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   1, 0, 0, 0, 0);
ad30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ad40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
ad50: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
ad60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
ad70: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
ad80: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
ad90: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
ada0: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
adb0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
adc0: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
add0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
ade0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
adf0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
ae00: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
ae10: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
ae20: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
ae30: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
ae40: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
ae50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65  = 0;.        pSe
ae60: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
ae70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
ae80: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
ae90: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  elTab);.      }.
aea0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
aeb0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
aec0: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
aed0: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
aee0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
aef0: 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
af00: 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
af10: 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  tmt(p);.    }els
af20: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e  e{.      n = pEn
af30: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
af40: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b  NameToken.z + 1;
af50: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
af60: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43  qlite3MPrintf("C
af70: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
af80: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
af90: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
afa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
afb0: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
afc0: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
afd0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
afe0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
aff0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
b000: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
b010: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
b020: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
b030: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
b040: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
b050: 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77  lected.  The row
b060: 69 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c  id for the preal
b070: 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73  located.    ** s
b080: 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69  lot is the 2nd i
b090: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
b0a0: 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  .  The top of th
b0b0: 65 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20  e stack is the. 
b0c0: 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
b0d0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b0e0: 65 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69  e (or a 0 if thi
b0f0: 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20  s is a view)..  
b100: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
b110: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
b120: 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
b130: 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
b140: 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
b150: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
b160: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
b170: 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20  e=#0, sql=%Q ". 
b180: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
b190: 69 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62  id=#1",.      db
b1a0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e  ->aDb[p->iDb].zN
b1b0: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
b1c0: 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20  E(p->iDb),.     
b1d0: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
b1e0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
b1f0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
b200: 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
b210: 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
b220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
b230: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
b240: 20 70 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e 64   p->iDb);..#ifnd
b250: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
b260: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
b270: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
b280: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
b290: 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
b2a0: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
b2b0: 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
b2c0: 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
b2d0: 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
b2e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
b2f0: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
b300: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
b310: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
b320: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 65      if( pDb->pSe
b330: 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
b340: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
b350: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
b360: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
b370: 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
b380: 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
b390: 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
b3a0: 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
b3b0: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
b3c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
b3d0: 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
b3e0: 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
b3f0: 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
b400: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
b410: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
b420: 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
b430: 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a  ema, p->iDb, 0,.
b440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
b450: 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
b460: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
b470: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
b480: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
b490: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
b4a0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
b4b0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
b4c0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
b4d0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
b4e0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
b4f0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
b500: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
b510: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44  y *pFKey; .    D
b520: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
b530: 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70  b[p->iDb];.    p
b540: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
b550: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62  hInsert(&pDb->tb
b560: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
b570: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
b580: 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  )+1, p);.    if(
b590: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
b5a0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
b5b0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
b5c0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
b5d0: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
b5e0: 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  ) */.      retur
b5f0: 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  n;.    }.#ifndef
b600: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
b610: 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72  EIGN_KEY.    for
b620: 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b  (pFKey=p->pFKey;
b630: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46   pFKey; pFKey=pF
b640: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  Key->pNextFrom){
b650: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
b660: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
b670: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
b680: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
b690: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
b6a0: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  &pDb->aFKey, pFK
b6b0: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
b6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
b6d0: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b  Insert(&pDb->aFK
b6e0: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
b6f0: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
b700: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
b710: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
b720: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
b730: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
b740: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
b750: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
b760: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b770: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
b780: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
b790: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
b7a0: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
b7b0: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
b7c0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
b7d0: 3e 7a 3d 3d 30 20 29 20 70 43 6f 6e 73 20 3d 20  >z==0 ) pCons = 
b7e0: 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  pEnd;.      p->a
b7f0: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
b800: 20 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20 2d 20 70   + (pCons->z - p
b810: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
b820: 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n.z);.    }.#end
b830: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
b840: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b850: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
b860: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
b870: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
b880: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
b890: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
b8a0: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
b8b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b8c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b8d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b8e0: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
b8f0: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
b900: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
b910: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
b920: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
b930: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
b940: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
b950: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b960: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
b970: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
b980: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
b990: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
b9a0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
b9b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b9c0: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
b9d0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
b9e0: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
b9f0: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
ba00: 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20   isTemp         
ba10: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
ba20: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
ba30: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
ba40: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
ba50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
ba60: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
ba70: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
ba80: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
ba90: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
baa0: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
bab0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bac0: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
bad0: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
bae0: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
baf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
bb00: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
bb10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
bb20: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
bb30: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
bb40: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
bb50: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 29  2, isTemp, 1, 0)
bb60: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
bb70: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
bb80: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
bb90: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
bba0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
bbb0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
bbc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
bbd0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
bbe0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
bbf0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
bc00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
bc10: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
bc20: 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69  rse, p->iDb, "vi
bc30: 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20  ew", pName).    
bc40: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  && sqlite3FixSel
bc50: 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
bc60: 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ct).  ){.    sql
bc70: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
bc80: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
bc90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
bca0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
bcb0: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
bcc0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
bcd0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
bce0: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
bcf0: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
bd00: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
bd10: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
bd20: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
bd30: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
bd40: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
bd50: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
bd60: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
bd70: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
bd80: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
bd90: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
bda0: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
bdb0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
bdc0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
bdd0: 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74  electDup(pSelect
bde0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
bdf0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
be00: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
be10: 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
be20: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
be30: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  n;.  }.  if( !pP
be40: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
be50: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
be60: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
be70: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
be80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
be90: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
bea0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
beb0: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
bec0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
bed0: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
bee0: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
bef0: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
bf00: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
bf10: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
bf20: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
bf30: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
bf40: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
bf50: 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  = sEnd.z - pBegi
bf60: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  n->z;.  z = (con
bf70: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
bf80: 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  *)pBegin->z;.  w
bf90: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b  hile( n>0 && (z[
bfa0: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73  n-1]==';' || iss
bfb0: 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b  pace(z[n-1])) ){
bfc0: 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
bfd0: 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
bfe0: 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
bff0: 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
c000: 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
c010: 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
c020: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
c030: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
c040: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
c050: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
c060: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
c070: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c080: 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EW */..#ifndef S
c090: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c0a0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
c0b0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
c0c0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
c0d0: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
c0e0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
c0f0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
c100: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
c110: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
c120: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
c130: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
c140: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
c150: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
c160: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
c170: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
c180: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
c190: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
c1a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
c1b0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
c1c0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
c1d0: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
c1e0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
c1f0: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
c200: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
c210: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
c220: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
c230: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
c240: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
c250: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
c260: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
c270: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
c280: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
c290: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
c2a0: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
c2b0: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
c2c0: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20  s assigned */.. 
c2d0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
c2e0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
c2f0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
c300: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
c310: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
c320: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
c330: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
c340: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
c350: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
c360: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
c370: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
c380: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
c390: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
c3a0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
c3b0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
c3c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
c3d0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
c3e0: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
c3f0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
c400: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
c410: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
c420: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
c430: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
c440: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
c450: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
c460: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
c470: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
c480: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
c490: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
c4a0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
c4b0: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
c4c0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
c4d0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
c4e0: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
c4f0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
c500: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
c510: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
c520: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
c530: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28    */.#if 0.  if(
c540: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
c550: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c560: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c570: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
c580: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
c590: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
c5a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c5b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
c5c0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
c5d0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
c5e0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
c5f0: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
c600: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
c610: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
c620: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
c630: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
c640: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
c650: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
c660: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
c670: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
c680: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
c690: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
c6a0: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
c6b0: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
c6c0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
c6d0: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
c6e0: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
c6f0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
c700: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
c710: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
c720: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
c730: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
c740: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
c750: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
c760: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
c770: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
c780: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
c790: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
c7a0: 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  up(pTable->pSele
c7b0: 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20  ct);.  if( pSel 
c7c0: 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  ){.    n = pPars
c7d0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
c7e0: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
c7f0: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
c800: 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
c810: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
c820: 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c 54 61 62   -1;.    pSelTab
c830: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c840: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c850: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
c860: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
c870: 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c   n;.    if( pSel
c880: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Tab ){.      ass
c890: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
c8a0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
c8b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
c8c0: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
c8d0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
c8e0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
c8f0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
c900: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
c910: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
c920: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
c930: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
c940: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 44 62  elTab);.      Db
c950: 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72  SetProperty(pPar
c960: 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e  se->db, pTable->
c970: 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  iDb, DB_UnresetV
c980: 69 65 77 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iews);.    }else
c990: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
c9a0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c9b0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
c9c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c9d0: 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d  elete(pSel);.  }
c9e0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
c9f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
ca00: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
ca10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ca20: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
ca30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ca40: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
ca50: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ca60: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
ca70: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
ca80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca90: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
caa0: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
cab0: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
cac0: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
cad0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
cae0: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
caf0: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
cb00: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
cb10: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
cb20: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
cb30: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
cb40: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
cb50: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
cb60: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
cb70: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
cb80: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
cb90: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
cba0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
cbb0: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
cbc0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
cbd0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
cbe0: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
cbf0: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
cc00: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
cc10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cc20: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
cc30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
cc40: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
cc50: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
cc60: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
cc70: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
cc80: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
cc90: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
cca0: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
ccb0: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
ccc0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
ccd0: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
cce0: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
ccf0: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
cd00: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69  ** to iTo..*/.#i
cd10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cd20: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
cd30: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
cd40: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
cd50: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
cd60: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
cd70: 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72  *pElem;.  .  for
cd80: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
cd90: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c  hFirst(&pDb->tbl
cda0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
cdb0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
cdc0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
cdd0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
cde0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
cdf0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
ce00: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
ce10: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
ce20: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
ce30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
ce40: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
ce50: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
ce60: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  Db->idxHash); pE
ce70: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
ce80: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
ce90: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
cea0: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
ceb0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
cec0: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
ced0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
cee0: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
cef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
cf00: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
cf10: 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  t(0);.}.#endif..
cf20: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
cf30: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
cf40: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
cf50: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
cf60: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
cf70: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
cf80: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
cf90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
cfa0: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
cfb0: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
cfc0: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
cfd0: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
cfe0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
cff0: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
d000: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
d010: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
d020: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
d030: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
d040: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
d050: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
d060: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
d070: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
d080: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
d090: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d0a0: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
d0b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d0c0: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
d0d0: 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53   iDb);.#ifndef S
d0e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d0f0: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
d100: 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20  stroy pushes an 
d110: 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65  integer onto the
d120: 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20   stack. If this 
d130: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
d140: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
d150: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
d160: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
d170: 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
d180: 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
d190: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
d1a0: 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
d1b0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d1c0: 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
d1d0: 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
d1e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22  **.  ** The "#0"
d1f0: 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
d200: 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
d210: 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
d220: 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
d230: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
d240: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  f the stack.  Se
d250: 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  e sqlite3Registe
d260: 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  rExpr()..  */.  
d270: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
d280: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
d290: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
d2a0: 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
d2b0: 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74  HERE #0 AND root
d2c0: 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70  page=#0",.     p
d2d0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
d2e0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
d2f0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
d300: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  able);.#endif.}.
d310: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
d320: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
d330: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
d340: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
d350: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
d360: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
d370: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d380: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
d390: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
d3a0: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
d3b0: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
d3c0: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
d3d0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
d3e0: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
d3f0: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
d400: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
d410: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
d420: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
d430: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
d440: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
d450: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
d460: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
d470: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d480: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d490: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d4a0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d4b0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
d4c0: 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  num, pTab->iDb);
d4d0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
d4e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d4f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d500: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
d510: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
d520: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d  Idx->tnum, pIdx-
d530: 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >iDb);.  }.#else
d540: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
d550: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
d560: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
d570: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
d580: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
d590: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
d5a0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
d5b0: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
d5c0: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
d5d0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
d5e0: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
d5f0: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
d600: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
d610: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
d620: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
d630: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
d640: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
d650: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
d660: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
d670: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
d680: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
d690: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
d6a0: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
d6b0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
d6c0: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
d6d0: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
d6e0: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
d6f0: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
d700: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
d710: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
d720: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
d730: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
d740: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
d750: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
d760: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
d770: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
d780: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
d790: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
d7a0: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
d7b0: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
d7c0: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
d7d0: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
d7e0: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
d7f0: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
d800: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
d810: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
d820: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
d830: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d840: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
d850: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
d860: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
d870: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
d880: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
d890: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
d8a0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
d8b0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d8c0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d8d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
d8e0: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
d8f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d900: 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  dx->iDb==pTab->i
d910: 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Db );.      if( 
d920: 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
d930: 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
d940: 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
d950: 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
d960: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
d970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d980: 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
d990: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d9a0: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
d9b0: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
d9c0: 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  st, pTab->iDb);.
d9d0: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
d9e0: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23   iLargest;.  }.#
d9f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
da00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
da10: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
da20: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
da30: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
da40: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
da50: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
da60: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
da70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
da80: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
da90: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
daa0: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
dab0: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
dac0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
dad0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
dae0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
daf0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
db00: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
db10: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
db20: 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
db30: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
db40: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73  drop_table;.  as
db50: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
db60: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
db70: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
db80: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
db90: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
dba0: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
dbb0: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
dbc0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
dbd0: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
dbe0: 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
dbf0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
dc00: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
dc10: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
dc20: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
dc30: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
dc40: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
dc50: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
dc60: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
dc70: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
dc80: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
dc90: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
dca0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
dcb0: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  b->iDb);.    con
dcc0: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
dcd0: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
dce0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
dcf0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
dd00: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
dd10: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
dd20: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
dd30: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
dd40: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
dd50: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
dd60: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
dd70: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
dd80: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
dd90: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
dda0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
ddb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
ddc0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
ddd0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
dde0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
ddf0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
de00: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
de10: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
de20: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
de30: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
de40: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
de50: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
de60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
de70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
de80: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
de90: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
dea0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
deb0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
dec0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
ded0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
dee0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
def0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
df00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
df10: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
df20: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
df30: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
df40: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
df50: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54  ->readOnly || pT
df60: 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ab==db->aDb[iDb]
df70: 2e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  .pSeqTab ){.    
df80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
df90: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
dfa0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
dfb0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
dfc0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
dfd0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
dfe0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
dff0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
e000: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
e010: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
e020: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
e030: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
e040: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
e050: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
e060: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
e070: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
e080: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e090: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e0a0: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
e0b0: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
e0c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e0d0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e0e0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
e0f0: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
e100: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
e110: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e120: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
e130: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
e140: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
e150: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e160: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e170: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
e180: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e190: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e1a0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
e1b0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
e1c0: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
e1d0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
e1e0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e1f0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
e200: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
e210: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70  .    int iDb = p
e220: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62  Tab->iDb;.    Db
e230: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
e240: 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
e250: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
e260: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
e270: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44   iDb);..    /* D
e280: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
e290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e2a0: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
e2b0: 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
e2c0: 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
e2d0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
e2e0: 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
e2f0: 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
e300: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
e310: 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
e320: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
e330: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
e340: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
e350: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
e360: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e370: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
e380: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
e390: 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20  >iDb==1 );.     
e3a0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
e3b0: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
e3c0: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
e3d0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
e3e0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
e3f0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
e400: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
e410: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52  CREMENT.    /* R
e420: 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
e430: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
e440: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
e450: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
e460: 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
e470: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
e480: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
e490: 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
e4a0: 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61  dropped.    ** a
e4b0: 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
e4c0: 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
e4d0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
e4e0: 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
e4f0: 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72    ** move as a r
e500: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f  esult of the dro
e510: 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e  p (can happen in
e520: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
e530: 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e)..    */.    i
e540: 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63  f( pTab->autoInc
e550: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e560: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
e570: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
e580: 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c  LETE FROM %s.sql
e590: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
e5a0: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
e5b0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
e5c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
e5d0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
e5e0: 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
e5f0: 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
e600: 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
e610: 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
e620: 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
e630: 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
e640: 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
e650: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
e660: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
e670: 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
e680: 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
e690: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
e6a0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
e6b0: 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
e6c0: 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
e6d0: 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
e6e0: 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
e6f0: 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
e700: 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
e710: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
e720: 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
e730: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
e740: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
e750: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
e760: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
e770: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
e780: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
e790: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
e7a0: 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
e7b0: 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
e7c0: 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
e7d0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
e7e0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
e7f0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e800: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
e810: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
e820: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
e830: 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
e840: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
e850: 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
e860: 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
e870: 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
e880: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
e890: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
e8a0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
e8b0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
e8c0: 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70  Table, iDb, 0, p
e8d0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
e8e0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
e8f0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
e900: 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
e910: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
e920: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
e930: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
e940: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
e950: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
e960: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e970: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
e980: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
e990: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
e9a0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
e9b0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
e9c0: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
e9d0: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
e9e0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
e9f0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
ea00: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
ea10: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
ea20: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
ea30: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
ea40: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
ea50: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
ea60: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
ea70: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
ea80: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
ea90: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
eaa0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
eab0: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
eac0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
ead0: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
eae0: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
eaf0: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
eb00: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
eb10: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
eb20: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
eb30: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
eb40: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
eb50: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
eb60: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
eb70: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
eb80: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
eb90: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
eba0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
ebb0: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
ebc0: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
ebd0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
ebe0: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
ebf0: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
ec00: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
ec10: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
ec20: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
ec30: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
ec40: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
ec50: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
ec60: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
ec70: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
ec80: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
ec90: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
eca0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
ecb0: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
ecc0: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
ecd0: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
ece0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
ecf0: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
ed00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ed10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ed20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
ed30: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
ed40: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
ed50: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
ed60: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
ed70: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
ed80: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
ed90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
eda0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
edb0: 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
edc0: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
edd0: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
ede0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
edf0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
ee00: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
ee10: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
ee20: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
ee30: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
ee40: 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
ee50: 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Key = 0;.  Table
ee60: 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
ee70: 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
ee80: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
ee90: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
eea0: 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
eeb0: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
eec0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
eed0: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
eee0: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
eef0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
ef00: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
ef10: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
ef20: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
ef30: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
ef40: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
ef50: 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
ef60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ef70: 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
ef80: 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
ef90: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
efa0: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
efb0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
efc0: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
efd0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
efe0: 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
eff0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
f000: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
f010: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
f020: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
f030: 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
f040: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
f050: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f060: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
f070: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f080: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
f090: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
f0a0: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
f0b0: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
f0c0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
f0d0: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
f0e0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
f0f0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
f100: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
f110: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
f120: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
f130: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
f140: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
f150: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
f160: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
f170: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
f180: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
f190: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
f1a0: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
f1b0: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
f1c0: 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
f1d0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
f1e0: 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
f1f0: 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  ==0 ) goto fk_en
f200: 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f  d;.  pFKey->pFro
f210: 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
f220: 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
f230: 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
f240: 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
f250: 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
f260: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
f270: 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
f280: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
f290: 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
f2a0: 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
f2b0: 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
f2c0: 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
f2d0: 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
f2e0: 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
f2f0: 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
f300: 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
f310: 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
f320: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
f330: 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
f340: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
f350: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
f360: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
f370: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
f380: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
f390: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
f3a0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f3b0: 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
f3c0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
f3d0: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
f3e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f3f0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
f400: 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
f410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f430: 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
f440: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
f450: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f460: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
f470: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
f480: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
f490: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
f4a0: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
f4b0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
f4c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
f4d0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
f4e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
f4f0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
f500: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
f510: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
f520: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
f530: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
f540: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
f550: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
f560: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
f570: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
f580: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
f590: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
f5a0: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
f5b0: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
f5c0: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
f5d0: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
f5e0: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
f5f0: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
f600: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
f610: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
f620: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
f630: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
f640: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
f650: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
f660: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
f670: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
f680: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
f690: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
f6a0: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
f6b0: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
f6c0: 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
f6d0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f6e0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
f6f0: 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
f700: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
f710: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
f720: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
f730: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
f740: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f750: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
f760: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
f770: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
f780: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
f790: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
f7a0: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
f7b0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
f7c0: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
f7d0: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
f7e0: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
f7f0: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
f800: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
f810: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
f820: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
f830: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
f840: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
f850: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
f860: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
f870: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f880: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
f890: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
f8a0: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
f8b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f8c0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
f8d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
f8e0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
f8f0: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
f900: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
f910: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
f920: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
f930: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
f940: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
f950: 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
f960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
f970: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
f980: 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
f990: 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
f9a0: 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
f9b0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
f9c0: 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
f9d0: 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
f9e0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
f9f0: 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
fa00: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
fa10: 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
fa20: 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
fa30: 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
fa40: 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
fa50: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
fa60: 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
fa70: 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ted.  The memory
fa80: 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20   cell specified 
fa90: 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
faa0: 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
fab0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
fac0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
fad0: 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
fae0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
faf0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
fb00: 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
fb10: 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
fb20: 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
fb30: 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
fb40: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
fb50: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
fb60: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
fb70: 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
fb80: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
fb90: 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
fba0: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
fbb0: 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
fbc0: 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
fbd0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
fbe0: 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
fbf0: 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
fc00: 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
fc10: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
fc20: 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f  e->nTab;       /
fc30: 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
fc40: 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
fc50: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
fc60: 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20  rse->nTab+1;    
fc70: 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
fc80: 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
fc90: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
fcc0: 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
fcd0: 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
fd00: 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  of index */.  Vd
fd10: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
fd40: 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
fd50: 6d 61 63 68 69 6e 65 20 2a 2f 0a 0a 23 69 66 6e  machine */..#ifn
fd60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd70: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
fd80: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
fd90: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fda0: 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
fdb0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
fdc0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
fdd0: 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
fde0: 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  ].zName ) ){.   
fdf0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
fe00: 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
fe10: 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65   all the require
fe20: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
fe30: 65 6e 63 65 73 20 61 72 65 20 61 76 61 69 6c 61  ences are availa
fe40: 62 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 72  ble. This.  ** r
fe50: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 76 6f  outine will invo
fe60: 6b 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ke the collation
fe70: 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b  -needed callback
fe80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 28 61   if necessary (a
fe90: 6e 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 68  nd.  ** if one h
fea0: 61 73 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  as been register
feb0: 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed)..  */.  if( 
fec0: 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65  sqlite3CheckInde
fed0: 78 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  xCollSeq(pParse,
fee0: 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
fef0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 76  return;.  }..  v
ff00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ff10: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ff20: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
ff30: 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
ff40: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
ff50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ff60: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52  OP_MemLoad, memR
ff70: 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  ootPage, 0);.   
ff80: 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c   tnum = 0;.  }el
ff90: 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
ffa0: 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Index->tnum;.   
ffb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ffc0: 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  p(v, OP_Clear, t
ffd0: 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
ffe0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
fff0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10000 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d  Integer, pIndex-
10010 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  >iDb, 0);.  sqli
10020 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10030 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
10040 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , tnum,.        
10050 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
10060 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  r*)&pIndex->keyI
10070 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
10080 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  ;.  sqlite3OpenT
10090 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76  ableForReading(v
100a0 2c 20 69 54 61 62 2c 20 70 54 61 62 29 3b 0a 20  , iTab, pTab);. 
100b0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
100c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
100d0 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
100e0 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
100f0 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70  ateIndexKey(v, p
10100 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20  Index, iTab);.  
10110 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
10120 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
10130 20 20 20 20 69 6e 74 20 63 75 72 61 64 64 72 20      int curaddr 
10140 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10150 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
10160 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75 72   int addr2 = cur
10170 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69  addr+4;.    sqli
10180 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
10190 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61 64  v, curaddr-1, ad
101a0 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr2);.    sqlite
101b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
101c0 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 30 29  _Rowid, iTab, 0)
101d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
101e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
101f0 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Imm, 1, 0);.    
10200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10210 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c  (v, OP_IsUnique,
10220 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a 20   iIdx, addr2);. 
10230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10240 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  3(v, OP_Halt, SQ
10250 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
10260 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20 20   OE_Abort,.     
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10280 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
10290 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
102a0 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
102b0 20 61 73 73 65 72 74 28 20 61 64 64 72 32 3d 3d   assert( addr2==
102c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
102d0 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d  ntAddr(v) );.  }
102e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
102f0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
10300 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ert, iIdx, 0);. 
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 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
10330 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  ab, addr1+1);.  
10340 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10350 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
10360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10370 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
10380 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
10390 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
103a0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
103b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
103c0 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
103d0 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
103e0 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
103f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
10400 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
10410 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
10420 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
10430 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
10440 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
10450 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
10460 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
10470 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
10480 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
10490 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
104a0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
104b0 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
104c0 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
104d0 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
104e0 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
104f0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
10500 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
10510 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
10520 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
10530 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
10540 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
10550 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10560 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
10570 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
10580 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
10590 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
105a0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
105b0 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
105c0 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
105d0 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
105e0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
105f0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
10600 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
10610 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
10620 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
10630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
10640 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
10650 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
10660 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
10670 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
10680 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
10690 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
106a0 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
106b0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
106c0 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
106d0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
106e0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
106f0 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
10700 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
10710 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
10720 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
10730 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
10740 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
10750 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
10760 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
10770 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
10780 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
10790 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
107a0 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
107b0 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
107c0 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
107d0 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
107e0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
107f0 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
10800 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
10810 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
10820 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
10830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
10840 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
10850 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
10860 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
10870 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
10880 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
10890 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
108a0 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
108b0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
108c0 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
108d0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
108e0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
108f0 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
10900 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
10910 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
10920 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
10930 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10940 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
10950 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
10960 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
10970 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
10980 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
10990 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
109a0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
109b0 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
109c0 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
109d0 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
109e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
109f0 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
10a00 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
10a10 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
10a20 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
10a30 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
10a40 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
10a50 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
10a60 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10a70 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
10a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10a90 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
10aa0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
10ab0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
10ac0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
10ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10ae0 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
10af0 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
10b00 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
10b10 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
10b20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
10b30 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
10b40 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
10b50 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
10b60 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
10b70 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
10b80 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
10b90 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
10ba0 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54  nErr || sqlite3T
10bb0 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
10bc0 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
10bd0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
10be0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
10bf0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
10c00 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
10c10 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
10c20 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
10c30 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
10c40 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
10c50 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
10c60 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
10c70 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
10c80 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
10c90 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
10ca0 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
10cb0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
10cc0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
10cd0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
10ce0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
10cf0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
10d00 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
10d10 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
10d20 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
10d30 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
10d40 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
10d50 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
10d60 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10d70 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ex;..#ifndef SQL
10d80 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
10d90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
10da0 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
10db0 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
10dc0 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65  if the the table
10dd0 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
10de0 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
10df0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
10e00 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20   to 1..    */.  
10e10 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
10e20 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
10e30 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
10e40 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20  .    if( pName2 
10e50 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  && pName2->n==0 
10e60 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
10e70 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20  >iDb==1 ){.     
10e80 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   iDb = 1;.    }.
10e90 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
10ea0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
10eb0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
10ec0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
10ed0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
10ee0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
10ef0 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
10f00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
10f10 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
10f20 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
10f30 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
10f40 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
10f50 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
10f60 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
10f70 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
10f80 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
10f90 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
10fa0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
10fb0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62  able(pParse, pTb
10fc0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
10fd0 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
10fe0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
10ff0 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
11000 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
11010 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11020 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
11030 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d  pTab->iDb );.  }
11040 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
11050 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
11060 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65    pTab =  pParse
11070 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
11080 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
11090 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
110a0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
110b0 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
110c0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
110d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
110e0 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
110f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
11100 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11110 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
11120 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
11130 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
11140 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
11150 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11160 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
11170 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
11180 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
11190 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
111a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
111b0 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
111c0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
111d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
111e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
111f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
11200 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
11210 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
11220 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
11230 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
11240 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
11250 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
11260 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
11270 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
11280 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
11290 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
112a0 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
112b0 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
112c0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
112d0 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
112e0 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
112f0 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
11300 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
11310 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
11320 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
11330 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
11340 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
11350 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
11360 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
11370 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
11380 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
11390 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
113a0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
113b0 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
113c0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
113d0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
113e0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
113f0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
11400 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
11410 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
11420 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
11430 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
11440 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
11450 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  me);.    if( SQL
11460 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
11470 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
11480 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
11490 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
114a0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
114b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
114c0 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53  index;.    if( S
114d0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
114e0 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
114f0 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
11500 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
11510 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11520 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
11530 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
11540 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
11550 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
11560 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
11570 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11580 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
11590 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
115a0 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
115b0 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
115c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
115d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
115e0 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
115f0 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
11600 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
11610 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11620 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
11630 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
11640 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
11650 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
11660 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11670 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
11680 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
11690 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
116a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
116b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
116c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
116d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
116e0 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
116f0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
11700 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
11710 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
11720 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
11730 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
11740 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
11750 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  {}.    sprintf(z
11760 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20  Buf,"_%d",n);.  
11770 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
11780 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
11790 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  g(&zName, "sqlit
117a0 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70  e_autoindex_", p
117b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66  Tab->zName, zBuf
117c0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
117d0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
117e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
117f0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
11800 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
11810 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
11820 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
11830 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11840 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11850 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
11860 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
11870 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db->zName;.    i
11880 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11890 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
118a0 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
118b0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
118c0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
118d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
118e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
118f0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
11900 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
11910 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
11920 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
11930 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
11940 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
11950 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
11960 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
11970 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
11980 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
11990 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
119a0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
119b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
119c0 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
119d0 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
119e0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
119f0 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
11a00 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
11a10 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
11a20 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
11a30 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
11a40 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
11a50 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
11a60 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
11a70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
11a80 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c  st==0 ){.    nul
11a90 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61  lId.z = (u8*)pTa
11aa0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
11ab0 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
11ac0 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
11ad0 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64  en((char*)nullId
11ae0 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
11af0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11b00 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
11b10 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
11b20 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
11b30 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11b40 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
11b50 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
11b60 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
11b70 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
11b80 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
11b90 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
11ba0 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
11bb0 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  ame);.  pIndex =
11bc0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
11bd0 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 6e  izeof(Index) + n
11be0 4e 61 6d 65 20 2b 20 32 20 2b 20 73 69 7a 65 6f  Name + 2 + sizeo
11bf0 66 28 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20  f(int) +.       
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 20   (sizeof(int)*2 
11c20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  + sizeof(CollSeq
11c30 2a 29 20 2b 20 31 29 2a 70 4c 69 73 74 2d 3e 6e  *) + 1)*pList->n
11c40 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71  Expr );.  if( sq
11c50 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c  lite3Tsd()->mall
11c60 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
11c70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11c80 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  x;.  pIndex->aiC
11c90 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
11ca0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
11cb0 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  Coll[pList->nExp
11cc0 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  r];.  pIndex->ai
11cd0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
11ce0 65 64 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ed*)&pIndex->aiC
11cf0 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78  olumn[pList->nEx
11d00 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  pr];.  pIndex->z
11d10 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
11d20 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
11d30 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b  pList->nExpr+1];
11d40 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
11d50 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  fo.aSortOrder = 
11d60 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e  &pIndex->zName[n
11d70 4e 61 6d 65 2b 31 5d 3b 0a 20 20 73 74 72 63 70  Name+1];.  strcp
11d80 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
11d90 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
11da0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
11db0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
11dc0 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
11dd0 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
11de0 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
11df0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
11e00 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
11e10 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d  .  pIndex->iDb =
11e20 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   iDb;..  /* Chec
11e30 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
11e40 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
11e50 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
11e60 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
11e70 20 20 69 66 28 20 70 44 62 2d 3e 66 69 6c 65 5f    if( pDb->file_
11e80 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
11e90 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
11ea0 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
11eb0 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
11ec0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
11ed0 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
11ee0 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
11ef0 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
11f00 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
11f10 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
11f20 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
11f30 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
11f40 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
11f50 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
11f60 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
11f70 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
11f80 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
11f90 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
11fa0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69  /.  for(i=0, pLi
11fb0 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b  stItem=pList->a;
11fc0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
11fd0 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
11fe0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
11ff0 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70  ar *zColName = p
12000 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  ListItem->zName;
12010 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  .    Column *pTa
12020 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65  bCol;.    int re
12030 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
12040 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ;.    for(j=0, p
12050 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
12060 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
12070 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
12080 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
12090 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
120a0 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
120b0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
120c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
120d0 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
120e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
120f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
12100 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
12110 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
12120 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
12130 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
12140 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
12150 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12160 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
12170 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
12180 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
12190 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20  tem->pExpr ){.  
121a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
121b0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
121c0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e  oll );.      pIn
121d0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
121e0 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 49 74 65  ll[i] = pListIte
121f0 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b  m->pExpr->pColl;
12200 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12210 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
12220 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61  o.aColl[i] = pTa
12230 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c  b->aCol[j].pColl
12240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
12250 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  rt( pIndex->keyI
12260 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a  nfo.aColl[i] );.
12270 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
12280 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20 20  t.busy && .     
12290 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43     sqlite3CheckC
122a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
122b0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
122c0 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b  Coll[i]) .    ){
122d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
122e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
122f0 20 20 20 7d 0a 20 20 20 20 72 65 71 75 65 73 74     }.    request
12300 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
12310 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
12320 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
12330 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
12340 6b 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64  keyInfo.aSortOrd
12350 65 72 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65  er[i] = requeste
12360 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
12370 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
12380 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74  o.nField = pList
12390 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
123a0 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
123b0 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20  pIndex);..  if( 
123c0 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
123d0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
123e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
123f0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
12400 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
12410 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
12420 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
12430 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
12440 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
12450 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
12460 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
12470 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
12480 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
12490 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
124a0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
124b0 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
124c0 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
124d0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
124e0 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
124f0 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
12500 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
12510 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
12520 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
12530 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
12540 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
12550 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
12560 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
12570 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
12580 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
12590 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
125a0 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
125b0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
125c0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
125d0 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
125e0 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
125f0 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
12600 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
12610 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
12620 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
12630 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
12640 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
12650 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
12660 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
12670 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12680 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
12690 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
126a0 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
126b0 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
126c0 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
126d0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
126e0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
126f0 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
12700 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
12710 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
12720 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
12730 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
12740 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
12750 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
12760 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
12770 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
12780 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  f( pIdx->keyInfo
12790 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65  .aColl[k]!=pInde
127a0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
127b0 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
127c0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6b       if( pIdx->k
127d0 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65  eyInfo.aSortOrde
127e0 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  r[k]!=pIndex->ke
127f0 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yInfo.aSortOrder
12800 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
12810 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
12820 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
12830 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12840 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
12850 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
12860 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
12870 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
12880 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
12890 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
128a0 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
128b0 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
128c0 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
128d0 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
128e0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
128f0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
12900 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
12910 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
12920 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
12930 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
12940 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
12950 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
12960 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
12970 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
12980 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
12990 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
129a0 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
129b0 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
129c0 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
129d0 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
129e0 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
129f0 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69  aviour for the i
12a00 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
12a10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
12a20 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
12a30 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
12a40 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
12a50 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
12a60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12a70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12a80 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
12a90 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
12aa0 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
12ab0 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
12ac0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
12ad0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
12ae0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
12af0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
12b00 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
12b10 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
12b20 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
12b30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12b40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
12b50 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12b60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12b70 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
12b80 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
12b90 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
12ba0 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
12bb0 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
12bc0 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
12bd0 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
12be0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
12bf0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
12c00 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
12c10 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
12c20 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
12c30 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ].idxHash, .    
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
12c60 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65  me, strlen(pInde
12c70 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  x->zName)+1, pIn
12c80 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
12c90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12ca0 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
12cb0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
12cc0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
12cd0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12ce0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12cf0 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
12d00 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
12d10 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20  hanges;.    if( 
12d20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
12d30 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
12d40 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
12d50 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tnum;.    }.  }.
12d60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
12d70 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
12d80 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
12d90 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
12da0 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
12db0 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
12dc0 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
12dd0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
12de0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
12df0 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
12e00 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
12e10 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
12e20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74   ** The db->init
12e30 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20  .busy is 0 when 
12e40 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
12e50 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
12e60 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
12e70 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  nd.  db->init.bu
12e80 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  sy is 1 when a d
12e90 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
12ea0 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
12eb0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
12ec0 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
12ed0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
12ee0 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
12ef0 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
12f00 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
12f10 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
12f20 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
12f30 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
12f40 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
12f50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
12f60 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61  blName==0 it mea
12f70 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
12f80 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20   generated as a 
12f90 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
12fa0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
12fb0 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54  raint of a CREAT
12fc0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
12fd0 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
12fe0 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
12ff0 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
13000 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
13010 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
13020 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
13030 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
13040 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
13050 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69    else if( db->i
13060 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
13070 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
13080 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
13090 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
130a0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20  se->nMem++;..   
130b0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
130c0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
130d0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
130e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
130f0 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ex;...    /* Cre
13100 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
13110 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
13120 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
13130 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
13140 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
13150 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
13160 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13170 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
13180 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
13190 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
131a0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
131b0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  , 0);..    /* Ga
131c0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
131d0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
131e0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
131f0 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
13200 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
13210 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
13220 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
13230 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  d ){.      /* A 
13240 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
13250 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
13260 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
13270 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
13280 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
13290 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e  ntf("CREATE%s IN
132a0 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
132b0 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
132c0 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
132d0 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
132e0 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
132f0 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
13300 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
13310 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
13320 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
13330 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
13340 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
13350 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
13360 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
13370 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
13380 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
13390 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
133a0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
133b0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
133c0 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
133d0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
133e0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
133f0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
13400 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
13410 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
13420 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25  ndex',%Q,%Q,#0,%
13430 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
13440 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
13450 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
13460 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
13470 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
13480 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
13490 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
134a0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
134b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
134c0 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
134d0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d   sqliteFree(zStm
134e0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
134f0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
13500 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
13510 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
13520 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
13530 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
13540 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
13550 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
13560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13570 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
13580 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
13590 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
135a0 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
135b0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
135c0 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
135d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
135e0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
135f0 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
13600 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
13610 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65  te3MPrintf("name
13620 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
13630 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
13640 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
13650 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13660 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b  P_Expire, 0, 0);
13670 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13680 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
13690 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
136a0 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
136b0 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
136c0 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
136d0 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
136e0 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
136f0 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
13700 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
13710 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
13720 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
13730 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
13740 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
13750 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
13760 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
13770 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
13780 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
13790 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
137a0 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
137b0 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
137c0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
137d0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
137e0 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
137f0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
13800 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
13810 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
13820 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
13830 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
13840 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
13850 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
13860 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
13870 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
13880 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
13890 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
138a0 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
138b0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
138c0 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
138d0 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
138e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
138f0 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
13900 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
13910 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
13920 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
13930 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
13940 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
13950 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
13960 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65   ){.    freeInde
13970 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
13980 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
13990 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
139a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
139b0 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b  elete(pTblName);
139c0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
139d0 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
139e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
139f0 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73  e code to make s
13a00 75 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ure the file for
13a10 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74  mat number is at
13a20 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74   least minFormat
13a30 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74  ..** The generat
13a40 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63  ed code will inc
13a50 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66  rease the file f
13a60 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20  ormat number if 
13a70 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f  necessary..*/.vo
13a80 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75  id sqlite3Minimu
13a90 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73  mFileFormat(Pars
13aa0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
13ab0 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61  Db, int minForma
13ac0 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  t){.  Vdbe *v;. 
13ad0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13ae0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13af0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
13b00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13b10 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
13b20 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 1);.    sqli
13b30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13b40 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46  OP_Integer, minF
13b50 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
13b60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13b70 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c  v, OP_Ge, 0, sql
13b80 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13b90 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73  ddr(v)+3);.    s
13ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13bb0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
13bc0 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  inFormat, 0);.  
13bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13be0 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
13bf0 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d  ie, iDb, 1);.  }
13c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
13c10 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
13c20 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
13c30 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
13c40 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
13c50 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
13c60 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
13c70 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
13c80 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
13c90 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
13ca0 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
13cb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
13cc0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
13cd0 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
13ce0 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
13cf0 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
13d00 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
13d10 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
13d20 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
13d30 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
13d40 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
13d50 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
13d60 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
13d70 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
13d80 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
13d90 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
13da0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
13db0 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
13dc0 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
13dd0 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69  cular combiniati
13de0 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
13df0 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
13e00 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
13e10 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
13e20 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
13e30 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
13e40 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
13e50 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
13e60 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
13e70 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
13e80 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
13e90 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
13ea0 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
13eb0 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
13ec0 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
13ed0 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
13ee0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
13ef0 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
13f00 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
13f10 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
13f20 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
13f30 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
13f40 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
13f50 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
13f60 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
13f70 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20    unsigned *a = 
13f80 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  pIdx->aiRowEst;.
13f90 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
13fa0 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30  t( a!=0 );.  a[0
13fb0 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66  ] = 1000000;.  f
13fc0 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(i=pIdx->nColu
13fd0 6d 6e 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a  mn; i>=1; i--){.
13fe0 20 20 20 20 61 5b 69 5d 20 3d 20 31 30 3b 0a 20      a[i] = 10;. 
13ff0 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
14000 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
14010 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e  ){.    a[pIdx->n
14020 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d  Column] = 1;.  }
14030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14040 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
14050 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
14060 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
14070 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
14080 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
14090 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
140a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
140b0 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
140c0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
140d0 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
140e0 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
140f0 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
14100 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14110 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
14120 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54  nErr || sqlite3T
14130 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
14140 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
14150 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
14160 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
14170 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
14180 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
14190 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
141a0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
141b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
141c0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
141d0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
141e0 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
141f0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
14200 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
14210 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
14220 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
14230 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14240 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
14250 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
14260 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
14270 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
14280 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
14290 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
142a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
142b0 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
142c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
142d0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
142e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
142f0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
14300 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
14310 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
14320 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
14330 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14340 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
14350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14360 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
14370 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
14380 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14390 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
143a0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
143b0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
143c0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
143d0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
143e0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
143f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
14400 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
14410 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
14420 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14430 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
14440 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
14450 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
14460 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14470 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
14480 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
14490 4d 50 44 42 20 26 26 20 70 49 6e 64 65 78 2d 3e  MPDB && pIndex->
144a0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
144b0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
144c0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
144d0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
144e0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
144f0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
14500 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
14510 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14520 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
14530 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
14540 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14550 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
14560 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
14570 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
14580 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
14590 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
145a0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
145b0 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d  nt iDb = pIndex-
145c0 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
145d0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
145e0 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
145f0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
14600 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
14610 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
14620 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
14630 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
14640 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
14650 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
14660 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
14670 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
14680 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
14690 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
146a0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
146b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
146c0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
146d0 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78  , iDb, 0, pIndex
146e0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
146f0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
14700 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
14710 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
14720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72  ;.}../*.** ppArr
14730 61 79 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 61  ay points into a
14740 20 73 74 72 75 63 74 75 72 65 20 77 68 65 72 65   structure where
14750 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 72 72   there is an arr
14760 61 79 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f  ay pointer.** fo
14770 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f 20 69 6e  llowed by two in
14780 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73  tegers. The firs
14790 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65  t integer is the
147a0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  .** number of el
147b0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 74  ements in the st
147c0 72 75 63 74 75 72 65 20 61 72 72 61 79 2e 20 20  ructure array.  
147d0 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
147e0 65 72 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  er.** is the num
147f0 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  ber of allocated
14800 20 73 6c 6f 74 73 20 69 6e 20 74 68 65 20 61 72   slots in the ar
14810 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ray..**.** In ot
14820 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 73  her words, the s
14830 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b 73 20 73  tructure looks s
14840 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
14850 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
14860 20 73 74 72 75 63 74 20 45 78 61 6d 70 6c 65 31   struct Example1
14870 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73   {.**          s
14880 74 72 75 63 74 20 73 75 62 45 6c 65 6d 20 2a 61  truct subElem *a
14890 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20 20 20 20  Entry;.**       
148a0 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a     int nEntry;.*
148b0 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  *          int n
148c0 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20 20 20 20  Alloc;.**       
148d0 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6e 45   }.**.** The pnE
148e0 6e 74 72 79 20 70 61 72 61 6d 65 74 65 72 20 70  ntry parameter p
148f0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 71 75  oints to the equ
14900 69 76 61 6c 65 6e 74 20 6f 66 20 45 78 61 6d 70  ivalent of Examp
14910 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a  le1.nEntry..**.*
14920 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
14930 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 73  llocates a new s
14940 6c 6f 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  lot in the array
14950 2c 20 7a 65 72 6f 73 20 69 74 20 6f 75 74 2c 0a  , zeros it out,.
14960 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 69  ** and returns i
14970 74 73 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 61  ts index.  If ma
14980 6c 6c 6f 63 20 66 61 69 6c 73 20 61 20 6e 65 67  lloc fails a neg
14990 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 73 20  ative number is 
149a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
149b0 73 7a 45 6e 74 72 79 20 69 73 20 74 68 65 20 73  szEntry is the s
149c0 69 7a 65 6f 66 20 6f 66 20 61 20 73 69 6e 67 6c  izeof of a singl
149d0 65 20 61 72 72 61 79 20 65 6e 74 72 79 2e 20 20  e array entry.  
149e0 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 20  initSize is the 
149f0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  .** number of ar
14a00 72 61 79 20 65 6e 74 72 69 65 73 20 61 6c 6c 6f  ray entries allo
14a10 63 61 74 65 64 20 6f 6e 20 74 68 65 20 69 6e 69  cated on the ini
14a20 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  tial allocation.
14a30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41  .*/.int sqlite3A
14a40 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 76 6f 69  rrayAllocate(voi
14a50 64 20 2a 2a 70 70 41 72 72 61 79 2c 20 69 6e 74  d **ppArray, int
14a60 20 73 7a 45 6e 74 72 79 2c 20 69 6e 74 20 69 6e   szEntry, int in
14a70 69 74 53 69 7a 65 29 7b 0a 20 20 63 68 61 72 20  itSize){.  char 
14a80 2a 70 3b 0a 20 20 69 6e 74 20 2a 61 6e 20 3d 20  *p;.  int *an = 
14a90 28 69 6e 74 2a 29 26 70 70 41 72 72 61 79 5b 31  (int*)&ppArray[1
14aa0 5d 3b 0a 20 20 69 66 28 20 61 6e 5b 30 5d 3e 3d  ];.  if( an[0]>=
14ab0 61 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 76 6f 69  an[1] ){.    voi
14ac0 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  d *pNew;.    int
14ad0 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65   newSize;.    ne
14ae0 77 53 69 7a 65 20 3d 20 61 6e 5b 31 5d 2a 32 20  wSize = an[1]*2 
14af0 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
14b00 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  pNew = sqliteRea
14b10 6c 6c 6f 63 28 2a 70 70 41 72 72 61 79 2c 20 6e  lloc(*ppArray, n
14b20 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b  ewSize*szEntry);
14b30 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
14b40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14b50 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   -1;.    }.    a
14b60 6e 5b 31 5d 20 3d 20 6e 65 77 53 69 7a 65 3b 0a  n[1] = newSize;.
14b70 20 20 20 20 2a 70 70 41 72 72 61 79 20 3d 20 70      *ppArray = p
14b80 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 2a  New;.  }.  p = *
14b90 70 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  ppArray;.  memse
14ba0 74 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74  t(&p[an[0]*szEnt
14bb0 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
14bc0 3b 0a 20 20 72 65 74 75 72 6e 20 61 6e 5b 30 5d  ;.  return an[0]
14bd0 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ++;.}../*.** App
14be0 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
14bf0 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
14c00 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
14c10 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
14c20 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
14c30 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
14c40 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
14c50 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
14c60 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
14c70 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
14c80 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
14c90 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
14ca0 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
14cb0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
14cc0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
14cd0 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
14ce0 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
14cf0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14d00 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
14d10 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
14d20 20 7d 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33   }.  i = sqlite3
14d30 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76  ArrayAllocate((v
14d40 6f 69 64 2a 2a 29 26 70 4c 69 73 74 2d 3e 61 2c  oid**)&pList->a,
14d50 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
14d60 5b 30 5d 29 2c 20 35 29 3b 0a 20 20 69 66 28 20  [0]), 5);.  if( 
14d70 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
14d80 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
14d90 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
14da0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
14db0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
14dc0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
14dd0 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  ken(pToken);.  r
14de0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
14df0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
14e00 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
14e10 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
14e20 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
14e30 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
14e40 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14e50 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
14e60 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
14e70 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
14e80 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
14e90 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
14ea0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
14eb0 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
14ec0 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
14ed0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
14ee0 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
14ef0 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
14f00 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
14f10 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
14f20 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
14f30 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
14f40 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
14f50 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
14f60 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
14f70 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
14f80 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
14f90 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
14fa0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
14fb0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
14fc0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
14fd0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
14fe0 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
14ff0 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
15000 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
15010 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
15020 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
15030 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
15040 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
15050 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
15060 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
15070 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
15080 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
15090 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72  ..**.** A new Sr
150a0 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
150b0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
150c0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a  lloc() fails..**
150d0 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
150e0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
150f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
15100 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
15110 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
15120 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
15130 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
15140 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
15150 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
15160 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
15170 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
15180 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
15190 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
151a0 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
151b0 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
151c0 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
151d0 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
151e0 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
151f0 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
15200 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
15210 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
15220 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
15230 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
15240 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
15250 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
15260 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
15270 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
15280 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
15290 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
152a0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
152b0 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
152c0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
152d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
152e0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
152f0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
15300 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
15310 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
15320 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
15330 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
15340 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
15350 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
15360 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
15370 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  pend(A,B,C);.**.
15380 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
15390 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
153a0 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
153b0 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69  e name..*/.SrcLi
153c0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
153d0 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74  stAppend(SrcList
153e0 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
153f0 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70  pTable, Token *p
15400 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72  Database){.  str
15410 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
15420 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
15430 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
15440 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
15450 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
15460 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
15470 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
15480 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
15490 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
154a0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
154b0 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
154c0 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
154d0 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
154e0 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
154f0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
15500 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20  Realloc(pList,. 
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
15520 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28  zeof(*pList) + (
15530 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29  pList->nAlloc-1)
15540 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
15550 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
15560 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
15570 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
15580 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
15590 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
155a0 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
155b0 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65  pNew;.  }.  pIte
155c0 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
155d0 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65  ist->nSrc];.  me
155e0 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
155f0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
15600 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ]));.  if( pData
15610 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
15620 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
15630 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
15640 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
15650 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20  e && pTable ){. 
15660 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
15670 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
15680 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
15690 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
156a0 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70  = pTemp;.  }.  p
156b0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
156c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
156d0 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  en(pTable);.  pI
156e0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
156f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
15700 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29  Token(pDatabase)
15710 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ;.  pItem->iCurs
15720 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74  or = -1;.  pList
15730 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
15740 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
15750 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  ** Assign cursor
15760 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
15770 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
15780 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
15790 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
157a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
157b0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
157c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
157d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
157e0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
157f0 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65  (pList || sqlite
15800 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  3Tsd()->mallocFa
15810 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 70 4c 69  iled);.  if( pLi
15820 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
15830 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
15840 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
15850 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
15860 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
15870 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
15880 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
15890 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
158a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
158b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
158c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
158d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
158e0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
158f0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
15900 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
15910 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
15920 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c  ./*.** Add an al
15930 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ias to the last 
15940 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68  identifier on th
15950 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69  e given identifi
15960 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  er list..*/.void
15970 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
15980 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
15990 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
159a0 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
159b0 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
159c0 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  rc>0 ){.    pLis
159d0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
159e0 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  -1].zAlias = sql
159f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
15a00 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d  n(pToken);.  }.}
15a10 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
15a20 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
15a30 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
15a40 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
15a50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15a60 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72  SrcListDelete(Sr
15a70 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
15a80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
15a90 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
15aa0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
15ab0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
15ac0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
15ad0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
15ae0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
15af0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
15b00 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44  teFree(pItem->zD
15b10 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
15b20 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
15b30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
15b40 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41  teFree(pItem->zA
15b50 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  lias);.    sqlit
15b60 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
15b70 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
15b80 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15b90 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53  Delete(pItem->pS
15ba0 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
15bb0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49  te3ExprDelete(pI
15bc0 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
15bd0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
15be0 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  te(pItem->pUsing
15bf0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
15c00 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
15c10 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
15c20 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
15c30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
15c40 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
15c50 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
15c60 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15c70 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
15c80 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61  nt i;..  if( pPa
15c90 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
15ca0 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
15cb0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
15cc0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
15cd0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
15ce0 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e  | sqlite3Tsd()->
15cf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
15d00 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
15d10 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15d20 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
15d30 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
15d40 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
15d50 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
15d60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15d70 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
15d80 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
15d90 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
15da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
15db0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
15dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15dd0 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
15de0 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
15df0 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
15e00 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
15e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e20 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
15e30 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
15e40 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
15e50 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
15e60 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61  sqlite3CommitTra
15e70 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
15e80 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
15e90 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
15ea0 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
15eb0 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
15ec0 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
15ed0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
15ee0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
15ef0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
15f00 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c  qlite3Tsd()->mal
15f10 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
15f20 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
15f30 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15f40 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
15f50 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
15f60 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
15f70 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
15f80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15f90 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
15fa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15fb0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
15fc0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
15fd0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
15fe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
15ff0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
16000 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
16010 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
16020 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
16030 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
16040 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
16050 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
16060 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
16070 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
16080 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
16090 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64  rr || sqlite3Tsd
160a0 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
160b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
160c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
160d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
160e0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
160f0 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
16100 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
16110 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16120 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
16130 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16140 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
16150 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
16160 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
16170 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
16180 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
16190 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
161a0 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
161b0 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
161c0 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
161d0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
161e0 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
161f0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
16200 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
16210 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
16220 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
16230 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
16240 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16250 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
16260 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
16270 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
16280 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
16290 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
162a0 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41  db, 0, 0, MAX_PA
162b0 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d  GES, &db->aDb[1]
162c0 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72  .pBt);.    if( r
162d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
162e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
162f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
16300 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
16310 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
16320 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
16330 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
16340 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
16350 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
16360 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
16370 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
16380 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
16390 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  s & !db->autoCom
163a0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  mit ){.      rc 
163b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
163c0 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62  ginTrans(db->aDb
163d0 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20  [1].pBt, 1);.   
163e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
163f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16400 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16410 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
16420 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c  to get a write l
16430 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20  ock on ".       
16440 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72     "the temporar
16450 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  y database file"
16460 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
16470 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
16480 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
164a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
164b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
164c0 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
164d0 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
164e0 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73  ema cookie and s
164f0 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74  tart.** a read-t
16500 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61  ransaction for a
16510 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ll named databas
16520 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  e files..**.** I
16530 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
16540 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63  hat all schema c
16550 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69  ookies be verifi
16560 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65  ed and all.** re
16570 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ad transactions 
16580 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
16590 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  e anything else 
165a0 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68  happens in.** th
165b0 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
165c0 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
165d0 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
165e0 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72  after much other
165f0 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65  .** code has bee
16600 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f  n generated.  So
16610 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65   here is what we
16620 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   do:.**.** The f
16630 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
16640 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16650 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f  , we code an OP_
16660 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c  Goto that.** wil
16670 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72  l jump to a subr
16680 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e  outine at the en
16690 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d of the program
166a0 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65  .  Then we.** re
166b0 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62  cord every datab
166c0 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69  ase that needs i
166d0 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69  ts schema verifi
166e0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61  ed in the.** pPa
166f0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
16700 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61  field.  Later, a
16710 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63  fter all other c
16720 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
16730 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73  generated, the s
16740 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ubroutine that d
16750 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  oes the cookie v
16760 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64  erifications and
16770 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74  .** starts the t
16780 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c  ransactions will
16790 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68   be coded and th
167a0 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c  e OP_Goto P2 val
167b0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
167c0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
167d0 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
167e0 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
167f0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
16800 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
16810 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
16820 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
16830 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
16840 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74  **.** If iDb<0 t
16850 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f  hen code the OP_
16860 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27  Goto only - don'
16870 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65  t set flag to ve
16880 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65  rify the.** sche
16890 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61  ma on any databa
168a0 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62  ses.  This can b
168b0 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
168c0 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a  on the OP_Goto.*
168d0 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63  * early in the c
168e0 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b  ode, before we k
168f0 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62  now if any datab
16900 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20  ase tables will 
16910 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  be used..*/.void
16920 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
16930 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
16940 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
16950 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16960 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
16970 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
16980 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16990 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
169a0 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
169b0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
169c0 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
169d0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
169e0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
169f0 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
16a00 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
16a10 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
16a20 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
16a30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16a40 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b  P_Goto, 0, 0)+1;
16a50 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d  .  }.  if( iDb>=
16a60 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
16a70 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
16a80 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16a90 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
16aa0 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  || iDb==1 );.   
16ab0 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32 20   assert( iDb<32 
16ac0 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c  );.    mask = 1<
16ad0 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70  <iDb;.    if( (p
16ae0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
16af0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
16b00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
16b10 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
16b20 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
16b30 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
16b40 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
16b50 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
16b60 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
16b70 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
16b80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16b90 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
16ba0 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  se(pParse);.    
16bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
16bc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16bd0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
16be0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
16bf0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
16c00 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
16c10 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
16c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16c30 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
16c40 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
16c50 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
16c60 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
16c70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
16c80 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
16c90 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
16ca0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
16cb0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
16cc0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
16cd0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
16ce0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
16cf0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
16d00 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
16d10 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
16d20 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
16d30 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
16d40 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
16d50 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
16d60 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
16d70 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
16d80 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16d90 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
16da0 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
16db0 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
16dc0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
16dd0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
16de0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
16df0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
16e00 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
16e10 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
16e20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
16e30 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
16e40 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
16e50 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
16e60 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f   be set..**.** O
16e70 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62  nly database iDb
16e80 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
16e90 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
16ea0 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73  writable by this
16eb0 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62   call..** If iDb
16ec0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ==0, then the ma
16ed0 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61  in and temp data
16ee0 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77  bases are made w
16ef0 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a  ritable.   If.**
16f00 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c   iDb==1 then onl
16f10 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  y the temp datab
16f20 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  ase is made writ
16f30 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20  able.  If iDb>1 
16f40 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63  then the.** spec
16f50 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20  ified auxiliary 
16f60 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
16f70 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
16f80 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
16f90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16fa0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
16fb0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
16fc0 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
16fd0 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
16fe0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
16ff0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
17000 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
17010 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
17020 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
17030 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
17040 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65  .  pParse->write
17050 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a  Mask |= 1<<iDb;.
17060 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65    if( setStateme
17070 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  nt && pParse->ne
17080 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
17090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
170a0 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c  v, OP_Statement,
170b0 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20   iDb, 0);.  }.  
170c0 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42  if( (OMIT_TEMPDB
170d0 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70   || iDb!=1) && p
170e0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
170f0 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20  ].pBt!=0 ){.    
17100 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
17110 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
17120 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  e, setStatement,
17130 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
17140 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
17150 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68  f pIndex uses th
17160 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
17170 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74  ence pColl.  Ret
17180 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69  urn.** true if i
17190 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65  t does and false
171a0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
171b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
171c0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
171d0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61  static int colla
171e0 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c 6c 53 65  tionMatch(CollSe
171f0 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  q *pColl, Index 
17200 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
17210 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  n = pIndex->keyI
17220 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20 20 43 6f  nfo.nField;.  Co
17230 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20 70 49 6e  llSeq **pp = pIn
17240 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
17250 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  ll;.  while( n--
17260 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 70 70 3d   ){.    if( *pp=
17270 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20  =pColl ) return 
17280 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a 20 20 7d  1;.    pp++;.  }
17290 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
172a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
172b0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
172c0 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
172d0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
172e0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
172f0 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
17300 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
17310 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
17320 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
17330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
17340 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
17350 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
17360 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
17370 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c 53 65 71  e *pTab, CollSeq
17380 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *pColl){.  Inde
17390 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
173a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
173b0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
173c0 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
173d0 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
173e0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
173f0 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
17400 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
17410 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
17420 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f 6c 6c 2c  tionMatch(pColl,
17430 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
17440 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
17450 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
17460 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62  se, 0, pTab->iDb
17470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17480 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
17490 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
174a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
174b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
174c0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
174d0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
174e0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
174f0 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
17500 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
17510 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
17520 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
17530 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
17540 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
17550 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
17560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17570 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
17580 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
17590 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
175a0 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71  *pParse, CollSeq
175b0 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *pColl){.  Db *
175c0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
175d0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
175e0 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
175f0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17610 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
17620 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
17630 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17640 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
17650 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
17660 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
17670 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
17680 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
17690 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
176a0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
176b0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
176c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
176d0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
176e0 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
176f0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
17700 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
17710 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
17720 20 20 20 20 69 66 28 20 70 44 62 3d 3d 30 20 29      if( pDb==0 )
17730 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
17740 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
17750 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  irst(&pDb->tblHa
17760 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
17770 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
17780 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
17790 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
177a0 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
177b0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
177c0 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a  , pTab, pColl);.
177d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
177e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
177f0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
17800 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
17810 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
17820 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
17850 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
17860 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
17870 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
17880 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
17890 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
178a0 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
178b0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
178c0 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
178d0 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
178e0 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
178f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
17900 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
17910 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
17920 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
17930 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
17940 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
17950 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
17960 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
17970 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
17980 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
17990 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
179a0 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
179b0 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
179c0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
179d0 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
179e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
179f0 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
17a00 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
17a10 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
17a20 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
17a30 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
17a40 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
17a50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
17a60 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
17a70 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
17a80 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
17a90 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
17aa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
17ab0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
17ac0 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
17ad0 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
17ae0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17af0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
17b00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17b20 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
17b30 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
17b40 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
17b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
17b60 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
17b70 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
17b80 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
17b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17ba0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
17bb0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
17bc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17bd0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
17be0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17bf0 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
17c00 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
17c10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
17c20 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
17c30 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
17c40 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
17c50 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
17c60 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
17c70 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
17c80 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
17c90 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
17ca0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
17cb0 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
17cc0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
17cd0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
17ce0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
17cf0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
17d00 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20  f( pName1==0 || 
17d10 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName1->z==0 ){.
17d20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
17d30 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
17d40 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
17d50 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d  else if( pName2=
17d60 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  =0 || pName2->z=
17d70 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
17d80 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
17d90 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65 6e 63  lSeq(db, db->enc
17da0 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 31 2d  , (char*)pName1-
17db0 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30  >z, pName1->n, 0
17dc0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
17dd0 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
17de0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
17df0 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, pColl);.     
17e00 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
17e10 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
17e20 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
17e30 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
17e40 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
17e50 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
17e60 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
17e70 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
17e80 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  en(pObjName);.  
17e90 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
17ea0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
17eb0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
17ec0 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
17ed0 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
17ee0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
17ef0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
17f00 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
17f10 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  (z);.    return;
17f20 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
17f30 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
17f40 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
17f50 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
17f60 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
17f70 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
17f80 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17f90 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
17fa0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
17fb0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
17fc0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
17fd0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
17fe0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17ff0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
18000 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
18010 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
18020 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.