/ Hex Artifact Content
Login

Artifact 715ac7d49bbfcae5f3fdfd60885397b2133c283b:


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 38 20 32 30 30 36 2f 30 31 2f 30 36  1.368 2006/01/06
02f0: 20 30 36 3a 33 33 3a 31 33 20 64 61 6e 69 65 6c   06:33:13 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nVar = 0;.}../*.
0430: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0440: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0450: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0460: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0470: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0480: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0490: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
04a0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
04b0: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
04c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
04d0: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
04e0: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
04f0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0500: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0510: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0520: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0530: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0540: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0550: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0560: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0570: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0580: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0590: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
05a0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
05b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
05c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
05d0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
05e0: 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61  sqlite3Tsd()->ma
05f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
0600: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
0610: 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75  e->nested ) retu
0620: 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  rn;.  if( !pPars
0630: 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
0640: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
0650: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
0660: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
0670: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
0680: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
0690: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
06a0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
06b0: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
06c0: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
06d0: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
06e0: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
06f0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64  program.  */.  d
0700: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0710: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
0720: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0730: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
0740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0750: 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b   OP_Halt, 0, 0);
0760: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
0770: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
0780: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
0790: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
07a0: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
07b0: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
07c0: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
07d0: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
07e0: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
07f0: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
0800: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
0810: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
0820: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
0830: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
0840: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
0850: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
0860: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
0870: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
0880: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
0890: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
08a0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
08b0: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b  >cookieGoto>0 ){
08c0: 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b  .      u32 mask;
08d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  .      int iDb;.
08e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
08f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61  eJumpHere(v, pPa
0900: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d  rse->cookieGoto-
0910: 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44  1);.      for(iD
0920: 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62  b=0, mask=1; iDb
0930: 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c  <db->nDb; mask<<
0940: 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  =1, iDb++){.    
0950: 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
0960: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
0970: 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  sk)==0 ) continu
0980: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
0990: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
09a0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
09b0: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
09c0: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
09d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
09e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
09f0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
0a00: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
0a10: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
0a20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
0a30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0a40: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
0a50: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
0a60: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  o);.    }..#ifnd
0a70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
0a80: 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20  RACE.    /* Add 
0a90: 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e  a No-op that con
0aa0: 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65  tains the comple
0ab0: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
0ac0: 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20  ompiled SQL.    
0ad0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  ** statement as 
0ae0: 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e  its P3 argument.
0af0: 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20    This does not 
0b00: 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74  change the funct
0b10: 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20  ionality.    ** 
0b20: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
0b30: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
0b40: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 69  his is used to i
0b50: 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
0b60: 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f  _trace()..    */
0b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0b80: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  Op3(v, OP_Noop, 
0b90: 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53  0, 0, pParse->zS
0ba0: 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69  ql, pParse->zTai
0bb0: 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b  l-pParse->zSql);
0bc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0bd0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
0be0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
0bf0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
0c00: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
0c10: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
0c20: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
0c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
0c40: 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c  *trace = (db->fl
0c50: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
0c60: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
0c70: 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c  out : 0;.    sql
0c80: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c  ite3VdbeTrace(v,
0c90: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c   trace);.    sql
0ca0: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
0cb0: 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61  y(v, pParse->nVa
0cc0: 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  r, pParse->nMem+
0cd0: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
0cf0: 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72  se->nTab+3, pPar
0d00: 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20  se->explain);.  
0d10: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0d20: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
0d30: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0d40: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
0d50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
0d60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0d70: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0d80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
0d90: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
0da0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0db0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Mem = 0;.  pPars
0dc0: 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70  e->nSet = 0;.  p
0dd0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
0de0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
0df0: 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  eMask = 0;.  pPa
0e00: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  rse->cookieGoto 
0e10: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  = 0;.}../*.** Ru
0e20: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
0e30: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
0e40: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
0e50: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
0e60: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
0e70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
0e80: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
0e90: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
0ea0: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
0eb0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
0ec0: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
0ed0: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
0ee0: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
0ef0: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
0f00: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
0f10: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
0f20: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
0f30: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
0f40: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
0f50: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
0f60: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
0f70: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
0f80: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
0f90: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
0fa0: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
0fb0: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
0fc0: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
0fd0: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
0fe0: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
0ff0: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
1000: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
1010: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
1020: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
1030: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
1040: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
1050: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1060: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1070: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1080: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1090: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
10a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
10b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
10c0: 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69 6e  r *zSql;.# defin
10d0: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
10e0: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
10f0: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
1100: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
1110: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
1120: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1130: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
1140: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
1150: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
1160: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
1170: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1180: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1190: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
11a0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
11b0: 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  VMPrintf(zFormat
11c0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
11d0: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
11e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
11f0: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1200: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1210: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1220: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1230: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1240: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1250: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1260: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1270: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1280: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1290: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b  Parse, zSql, 0);
12a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53  .  sqliteFree(zS
12b0: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ql);.  memcpy(&p
12c0: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76  Parse->nVar, sav
12d0: 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  eBuf, SAVE_SZ);.
12e0: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
12f0: 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  --;.}../*.** Loc
1300: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1310: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1320: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
1330: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1340: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
1350: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
1360: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
1370: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
1380: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1390: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
13a0: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
13b0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
13c0: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
13d0: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
13e0: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
13f0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
1400: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
1410: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
1420: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
1430: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
1440: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
1450: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
1460: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
1470: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
1480: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
1490: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
14a0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
14b0: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
14c0: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
14d0: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
14e0: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
14f0: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
1500: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
1510: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
1520: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1530: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1540: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
1550: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
1560: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
1570: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73  zName!=0 );.  as
1580: 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73  sert( (db->flags
1590: 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61   & SQLITE_Initia
15a0: 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e  lized) || db->in
15b0: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72  it.busy );.  for
15c0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
15d0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
15e0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
15f0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
1600: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
1610: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
1620: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
1630: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
1640: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
1650: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
1660: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1670: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1680: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
1690: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
16a0: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
16b0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
16c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
16d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
16e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
16f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1700: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1710: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1720: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1730: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1740: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1750: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1760: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1770: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1780: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1790: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
17a0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
17b0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
17c0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
17d0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
17e0: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
17f0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1800: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1810: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
1820: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
1830: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
1840: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
1850: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1860: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
1870: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
1880: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
1890: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
18a0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73  LocateTable(Pars
18b0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
18c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
18d0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
18e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
18f0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1900: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1910: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1920: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1930: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1940: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1950: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1960: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1970: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1980: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1990: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19a0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
19b0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
19c0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
19d0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
19e0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
19f0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
1a00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a10: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a20: 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20   table: %s.%s", 
1a30: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
1a40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a50: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a60: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1a70: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e  h table: %s", zN
1a80: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1a90: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1aa0: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
1ab0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1ac0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
1ad0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1ae0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1af0: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
1b00: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
1b10: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
1b20: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
1b30: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1b40: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
1b50: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
1b60: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1b70: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
1b80: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
1b90: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
1ba0: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
1bb0: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61  r the.** table a
1bc0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  nd the first mat
1bd0: 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72  ching index is r
1be0: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
1bf0: 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75  ecking.** for du
1c00: 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61  plicate index na
1c10: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
1c20: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
1c30: 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74  is.** TEMP first
1c40: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
1c50: 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  n any auxiliary 
1c60: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a  databases added.
1c70: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ** using the ATT
1c80: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ACH command..*/.
1c90: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69  Index *sqlite3Fi
1ca0: 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ndIndex(sqlite3 
1cb0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1cc0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1cd0: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65  ar *zDb){.  Inde
1ce0: 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  x *p = 0;.  int 
1cf0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62  i;.  assert( (db
1d00: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1d10: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c  _Initialized) ||
1d20: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1d30: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
1d40: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
1d50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1d60: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1d70: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1d80: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1d90: 20 2a 2f 0a 20 20 20 20 44 62 53 63 68 65 6d 61   */.    DbSchema
1da0: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
1db0: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[j].pSchema;.
1dc0: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
1dd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1de0: 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  b, db->aDb[j].zN
1df0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 63  .    assert( pSc
1e10: 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20 26 26  hema || (j==1 &&
1e20: 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   !db->aDb[1].pBt
1e30: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63  ) );.    if( pSc
1e40: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 20  hema ){.      p 
1e50: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1e60: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
1e70: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
1e80: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
1e90: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20 29 20    }.    if( p ) 
1ea0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1eb0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1ec0: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
1ed0: 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  ry used by an in
1ee0: 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dex.*/.static vo
1ef0: 69 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64  id freeIndex(Ind
1f00: 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ex *p){.  sqlite
1f10: 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  Free(p->zColAff)
1f20: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
1f30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
1f40: 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  ve the given ind
1f50: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
1f60: 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e  x hash table, an
1f70: 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65  d free.** its me
1f80: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e  mory structures.
1f90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
1fa0: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
1fb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1fc0: 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a  sh tables but.**
1fd0: 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e   it is not unlin
1fe0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ked from the Tab
1ff0: 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78  le that it index
2000: 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67  es..** Unlinking
2010: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
2020: 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20  must be done by 
2030: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
2040: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2050: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
2060: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
2070: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
2080: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20   Index *pOld;.  
2090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
20a0: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  e = p->zName;.. 
20b0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
20c0: 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
20d0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
20e0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a  zName, strlen( z
20f0: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61  Name)+1, 0);.  a
2100: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
2110: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66  | pOld==p );.  f
2120: 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a  reeIndex(p);.}..
2130: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e  /*.** For the in
2140: 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e  dex called zIdxN
2150: 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75  ame which is fou
2160: 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nd in the databa
2170: 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b  se iDb,.** unlik
2180: 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f  e that index fro
2190: 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e  m its Table then
21a0: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
21b0: 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e  x from.** the in
21c0: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61  dex hash table a
21d0: 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  nd free all memo
21e0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ry structures as
21f0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
2200: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76   the index..*/.v
2210: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
2220: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
2230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2240: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
2250: 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49   *zIdxName){.  I
2260: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
2270: 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20  int len;.  Hash 
2280: 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44  *pHash = &db->aD
2290: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
22a0: 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20  idxHash;..  len 
22b0: 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d  = strlen(zIdxNam
22c0: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
22d0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
22e0: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
22f0: 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69  , len+1, 0);.  i
2300: 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
2310: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
2320: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
2330: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
2340: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2350: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
2360: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
2370: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
2380: 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64        for(p=pInd
2390: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
23a0: 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  ex; p && p->pNex
23b0: 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e  t!=pIndex; p=p->
23c0: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69  pNext){}.      i
23d0: 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  f( p && p->pNext
23e0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
23f0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
2400: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2410: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2420: 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
2430: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
2440: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
2450: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2460: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
2470: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
2480: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
2490: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
24a0: 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20   of.** a single 
24b0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
24c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24d0: 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d  d to reclaim mem
24e0: 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68  ory.** before th
24f0: 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65  e database close
2500: 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63  s.  It is also c
2510: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72  alled during a r
2520: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68  ollback.** if th
2530: 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20  ere were schema 
2540: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
2550: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
2560: 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61  r if a.** schema
2570: 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68  -cookie mismatch
2580: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   occurs..**.** I
2590: 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65  f iDb<=0 then re
25a0: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
25b0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66   schema tables f
25c0: 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
25d0: 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44  ** files.  If iD
25e0: 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20  b>=2 then reset 
25f0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
2600: 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65  ema for only the
2610: 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  .** single file 
2620: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f  indicated..*/.vo
2630: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  id sqlite3ResetI
2640: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71  nternalSchema(sq
2650: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2660: 44 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Db){.  int i, j;
2670: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
2680: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
2690: 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  b );.  db->flags
26a0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74   &= ~SQLITE_Init
26b0: 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69  ialized;.  for(i
26c0: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
26d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
26e0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
26f0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
2700: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2710: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65  sqlite3SchemaFre
2720: 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pDb->pSchema);
2730: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2740: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
2750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
2760: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
2770: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
2780: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20  ternChanges;..  
2790: 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  /* If one or mor
27a0: 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61  e of the auxilia
27b0: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
27c0: 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  s has been close
27d0: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d  d,.  ** then rem
27e0: 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68  ove then from th
27f0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2800: 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74  base list.  We t
2810: 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70  ake the.  ** opp
2820: 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74  ortunity to do t
2830: 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77  his here since w
2840: 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65  e have just dele
2850: 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20  ted all of the. 
2860: 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20   ** schema hash 
2870: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65  tables and there
2880: 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  fore do not have
2890: 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61   to make any cha
28a0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79  nges.  ** to any
28b0: 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73   of those tables
28c0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
28d0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
28e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
28f0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
2900: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
2910: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
2920: 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20    if( pDb->pAux 
2930: 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78  && pDb->xFreeAux
2940: 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78   ) pDb->xFreeAux
2950: 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20  (pDb->pAux);.   
2960: 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30     pDb->pAux = 0
2970: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
2980: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
2990: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
29a0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
29b0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
29c0: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
29d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
29e0: 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  ree(pDb->zName);
29f0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
2a00: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
2a10: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
2a20: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
2a30: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
2a40: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
2a50: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
2a60: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
2a70: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
2a80: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
2a90: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
2aa0: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
2ab0: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
2ac0: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
2ad0: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
2ae0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
2af0: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
2b00: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
2b10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
2b20: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
2b30: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
2b40: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
2b50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2b60: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
2b70: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
2b80: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
2b90: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
2ba0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
2bb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2bc0: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
2bd0: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
2be0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
2bf0: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
2c00: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
2c10: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
2c20: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
2c30: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
2c40: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
2c50: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
2c60: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
2c70: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2c80: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
2c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2ca0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2cb0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
2cc0: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
2cd0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
2ce0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2cf0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2d00: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
2d10: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2d20: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  es;.}../*.** Cle
2d30: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
2d40: 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  mes from a table
2d50: 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61   or view..*/.sta
2d60: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52  tic void sqliteR
2d70: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
2d80: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
2d90: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
2da0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
2db0: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
2dc0: 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54    if( (pCol = pT
2dd0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29  able->aCol)!=0 )
2de0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
2df0: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
2e00: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
2e10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
2e20: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
2e30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2e40: 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  ete(pCol->pDflt)
2e50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
2e60: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
2e70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2e80: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2e90: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ol);.  }.  pTabl
2ea0: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
2eb0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
2ec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2ed0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
2ee0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2ef0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2f00: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
2f10: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
2f20: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
2f30: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
2f40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f50: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
2f60: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
2f70: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
2f80: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
2f90: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
2fa0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
2fb0: 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73  table.  Nor does
2fc0: 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f   it remove.** fo
2fd0: 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20  reign keys from 
2fe0: 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79  the sqlite.aFKey
2ff0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
3000: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
3010: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
3020: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
3030: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
3040: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3050: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
3060: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69  able..**.** Indi
3070: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
3080: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72  ith the table ar
3090: 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  e unlinked from 
30a0: 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61  the "db".** data
30b0: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62   structure if db
30c0: 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d  !=NULL.  If db==
30d0: 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74  NULL, indices at
30e0: 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65  tached to.** the
30f0: 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74   table are delet
3100: 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73  ed, but it is as
3110: 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20  sumed they have 
3120: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20  already been.** 
3130: 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69  unlinked..*/.voi
3140: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
3150: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
3160: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
3170: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
3180: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
3190: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
31a0: 46 4b 65 79 3b 0a 0a 20 20 64 62 20 3d 20 30 3b  FKey;..  db = 0;
31b0: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
31c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
31d0: 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  * Do not delete 
31e0: 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20  the table until 
31f0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
3200: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
3210: 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  . */.  pTable->n
3220: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61  Ref--;.  if( pTa
3230: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  ble->nRef>0 ){. 
3240: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3250: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
3260: 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
3270: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
3280: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
3290: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
32a0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
32b0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
32c0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
32d0: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
32e0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
32f0: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
3300: 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  ( pIndex->pSchem
3310: 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  a==pTable->pSche
3320: 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
3330: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
3340: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69  pIndex);.  }..#i
3350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3360: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
3370: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
3380: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3390: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
33a0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73  table.  The keys
33b0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
33c0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  e already been u
33d0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
33e0: 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20   db->aFKey hash 
33f0: 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f  table .  */.  fo
3400: 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e  r(pFKey=pTable->
3410: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
3420: 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a  Key=pNextFKey){.
3430: 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20      pNextFKey = 
3440: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
3450: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3460: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
3470: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
3480: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
34b0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
34c0: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
34d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
34e0: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
34f0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
3500: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
3510: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
3520: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
3530: 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a  nNames(pTable);.
3540: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3550: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
3560: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3570: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
3580: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3590: 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  e(pTable->pSelec
35a0: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
35b0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
35c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
35d0: 65 28 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  e(pTable->pCheck
35e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
35f0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
3600: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
3610: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
3620: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
3630: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
3640: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
3650: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
3660: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
3670: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3680: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3690: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
36a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
36b0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
36c0: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
36d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
36e0: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
36f0: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
3700: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
3710: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
3720: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
3730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
3740: 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61  abName && zTabNa
3750: 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d  me[0] );.  pDb =
3760: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
3770: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
3780: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
3790: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
37a0: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
37b0: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29 3b  (zTabName)+1,0);
37c0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e  .  if( p ){.#ifn
37d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37e0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
37f0: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
3800: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
3810: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
3820: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
3830: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
3840: 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71  ;.      pF2 = sq
3850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
3860: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  Db->pSchema->aFK
3870: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
3880: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  o);.      if( pF
3890: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
38a0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
38b0: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
38c0: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  a->aFKey, pF1->z
38d0: 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e  To, nTo, pF1->pN
38e0: 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65  extTo);.      }e
38f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69  lse{.        whi
3900: 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e  le( pF2 && pF2->
3910: 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20  pNextTo!=pF1 ){ 
3920: 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f  pF2=pF2->pNextTo
3930: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
3940: 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pF2 ){.         
3950: 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20   pF2->pNextTo = 
3960: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20  pF1->pNextTo;.  
3970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3980: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
3990: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
39a0: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ble(db, p);.  }.
39b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
39c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
39d0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
39e0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
39f0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
3a00: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
3a10: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
3a20: 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79  * token with any
3a30: 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f   quotations remo
3a40: 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ved.  Space to h
3a50: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
3a60: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
3a70: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
3a80: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
3a90: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
3aa0: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
3ab0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
3ac0: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
3ad0: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
3ae0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
3af0: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
3b00: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
3b10: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
3b20: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
3b30: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
3b40: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
3b50: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3b60: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
3b70: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
3b80: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  3NameFromToken(T
3b90: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
3ba0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
3bb0: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
3bc0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
3bd0: 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 4e 61  rNDup((char*)pNa
3be0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
3bf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
3c00: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
3c10: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
3c20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
3c30: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
3c40: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
3c50: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
3c60: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
3c70: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
3c80: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
3c90: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
3ca0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
3cb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3cc0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
3cd0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62  Vdbe *v, int iDb
3ce0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
3cf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
3d00: 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
3d10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3d20: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
3d30: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
3d40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3d50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
3d60: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29  umColumns, 0, 5)
3d70: 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  ; /* sqlite_mast
3d80: 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73  er has 5 columns
3d90: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   */.}../*.** The
3da0: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
3db0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
3dc0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
3dd0: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
3de0: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
3df0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
3e00: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
3e10: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
3e20: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
3e30: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
3e40: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
3e50: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
3e60: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
3e70: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
3e80: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
3e90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
3ea0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
3eb0: 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44   i = -1;    /* D
3ec0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
3ed0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
3ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3ef0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
3f00: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a  e name */.  Db *
3f10: 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  pDb;       /* A 
3f20: 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20 6e  database whose n
3f30: 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65 69  ame space is bei
3f40: 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  ng searched */. 
3f50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3f60: 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73  /* Name we are s
3f70: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
3f80: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
3f90: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
3fa0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
3fb0: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  ame ){.    n = s
3fc0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
3fd0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
3fe0: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
3ff0: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
4000: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
4010: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
4020: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
4030: 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61  =strlen(pDb->zNa
4040: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4050: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
4060: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
4070: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
4080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4090: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
40a0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
40b0: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
40c0: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
40d0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
40e0: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
40f0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
4100: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
4110: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
4120: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
4130: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
4140: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
4150: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
4160: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
4170: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
4180: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4190: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
41a0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
41b0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
41c0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
41d0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
41e0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
41f0: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4200: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
4210: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4220: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
4230: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
4240: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4250: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
4260: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
4270: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
4280: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
4290: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
42a0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
42b0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
42c0: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
42d0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
42e0: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
42f0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
4300: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
4310: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4320: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
4330: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
4340: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
4350: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
4360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
4370: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
4380: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
4390: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
43a0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
43b0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
43c0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
43d0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
43e0: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
43f0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
4400: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
4410: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
4420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4430: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4440: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
4450: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
4460: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4470: 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32  b;..  if( pName2
4480: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
4490: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
44a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
44b0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
44c0: 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20  pName2;.    iDb 
44d0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
44e0: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
44f0: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
4500: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4510: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
4520: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54  nown database %T
4530: 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  ", pName1);.    
4540: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4550: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
4560: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
4570: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
4580: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c  ->init.iDb==0 ||
4590: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
45a0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  ;.    iDb = db->
45b0: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70  init.iDb;.    *p
45c0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b  Unqual = pName1;
45d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44  .  }.  return iD
45e0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  b;.}../*.** This
45f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4600: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
4610: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e   UTF-8 string zN
4620: 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a  ame is a legal.*
4630: 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * unqualified na
4640: 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68  me for a new sch
4650: 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c  ema object (tabl
4660: 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f  e, index, view o
4670: 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41  r.** trigger). A
4680: 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67  ll names are leg
4690: 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20  al except those 
46a0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
46b0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73  the string.** "s
46c0: 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65  qlite_" (in uppe
46d0: 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65  r, lower or mixe
46e0: 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f  d case). This po
46f0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d  rtion of the nam
4700: 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73  espace.** is res
4710: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
4720: 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  al use..*/.int s
4730: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
4740: 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61  tName(Parse *pPa
4750: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
4760: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21  *zName){.  if( !
4770: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
4780: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
4790: 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20  >nested==0 .    
47a0: 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65        && (pParse
47b0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
47c0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
47d0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
47e0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e  & 0==sqlite3StrN
47f0: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ICmp(zName, "sql
4800: 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20  ite_", 7) ){.   
4810: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4820: 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74  (pParse, "object
4830: 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66   name reserved f
4840: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a  or internal use:
4850: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
4860: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4870: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
4880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4890: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
48a0: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
48b0: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
48c0: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
48d0: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
48e0: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
48f0: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
4900: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
4910: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
4920: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
4930: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
4940: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
4950: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4960: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
4970: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
4980: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
4990: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
49a0: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
49b0: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
49c0: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
49d0: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
49e0: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
49f0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
4a00: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
4a10: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
4a20: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
4a30: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
4a40: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
4a50: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
4a60: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
4a70: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
4a80: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
4a90: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
4aa0: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
4ab0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
4ac0: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
4ad0: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
4ae0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
4af0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
4b00: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
4b10: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
4b20: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
4b30: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4b40: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
4b50: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
4b60: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
4b70: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
4b80: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
4b90: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
4ba0: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
4bb0: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
4bc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
4bd0: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
4be0: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
4bf0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
4c00: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
4c10: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
4c20: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
4c30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4c40: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
4c50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4c60: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4c70: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  t */.  Token *pS
4c80: 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22  tart,   /* The "
4c90: 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f  CREATE" token */
4ca0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4cb0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
4cc0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
4cd0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
4ce0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
4cf0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
4d00: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
4d10: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
4d20: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
4d30: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
4d40: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
4d50: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
4d60: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
4d70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4d80: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
4d90: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
4da0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
4db0: 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65  ng if table alre
4dc0: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
4dd0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
4de0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
4df0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
4e00: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4e10: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
4e20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4e30: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
4e40: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
4e50: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4e60: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
4e70: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
4e80: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
4e90: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
4ea0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4eb0: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
4ec0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
4ed0: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
4ee0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
4ef0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
4f00: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
4f10: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
4f20: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
4f30: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
4f40: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
4f50: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
4f60: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
4f70: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
4f80: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
4f90: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4fa0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4fb0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
4fc0: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
4fd0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
4fe0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
4ff0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
5000: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5010: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
5020: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5030: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5040: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5050: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
5060: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
5070: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
5080: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5090: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
50a0: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
50b0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
50c0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
50d0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
50e0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
50f0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
5100: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
5110: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
5120: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
5130: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
5140: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
5150: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
5160: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
5170: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
5180: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
5190: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
51a0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
51b0: 26 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  & isTemp && iDb>
51c0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
51d0: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
51e0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
51f0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
5200: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
5210: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5220: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
5230: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
5240: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
5250: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5260: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5270: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
5280: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5290: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
52a0: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
52b0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
52c0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
52d0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
52e0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
52f0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
5300: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
5310: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
5320: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
5330: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5340: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  }.  if( db->init
5350: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
5360: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
5370: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
5380: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
5390: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
53a0: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
53b0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
53c0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
53d0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
53e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
53f0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
5400: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
5410: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
5420: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
5430: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
5440: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5450: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5460: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5470: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5480: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5490: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
54a0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
54b0: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
54c0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
54d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
54e0: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
54f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
5500: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5510: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
5520: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5530: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5540: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
5550: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5560: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
5570: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
5580: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5590: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
55a0: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
55b0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
55c0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
55d0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
55e0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
55f0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
5600: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
5610: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
5620: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
5630: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
5640: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
5650: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
5660: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
5670: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
5680: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
5690: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
56a0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
56b0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
56c0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
56d0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
56e0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
56f0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
5700: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
5710: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
5720: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e  le ){.    if( !n
5730: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  oErr ){.      sq
5740: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5750: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
5760: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
5770: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   pName);.    }. 
5780: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5790: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
57a0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
57b0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
57c0: 20 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d   0)!=0 && (iDb==
57d0: 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62  0 || !db->init.b
57e0: 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  usy) ){.    sqli
57f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5800: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
5810: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
5820: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
5830: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
5840: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5850: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
5860: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
5870: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
5880: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
5890: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
58a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
58b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
58c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
58d0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
58e0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
58f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
5900: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
5910: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
5920: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  0;.  pTable->iPK
5930: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
5940: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  e->pIndex = 0;. 
5950: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
5960: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
5970: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
5980: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69  e->nRef = 1;.  i
5990: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
59a0: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65  able ) sqlite3De
59b0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50  leteTable(db, pP
59c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
59d0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
59e0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
59f0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
5a00: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
5a10: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
5a20: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
5a30: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
5a40: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
5a50: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
5a60: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
5a70: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
5a80: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
5a90: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
5aa0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
5ab0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
5ac0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
5ad0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
5ae0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
5af0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
5b00: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
5b10: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65  =0 ){.    pTable
5b20: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
5b30: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
5b40: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
5b50: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
5b60: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
5b70: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
5b80: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
5b90: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
5ba0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
5bb0: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
5bc0: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
5bd0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
5be0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
5bf0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5c00: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
5c10: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
5c20: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
5c30: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
5c40: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
5c50: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
5c60: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
5c70: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
5c80: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
5c90: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
5ca0: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
5cb0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
5cc0: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
5cd0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
5ce0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
5cf0: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
5d00: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
5d10: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
5d20: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
5d30: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
5d40: 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a  ){.    int lbl;.
5d50: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
5d60: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
5d70: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
5d80: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
5d90: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
5da0: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
5db0: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
5dc0: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
5dd0: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
5de0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5e00: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
5e10: 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c  Db, 1);   /* fil
5e20: 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e_format */.    
5e30: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
5e40: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5e50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e60: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c  dOp(v, OP_If, 0,
5e70: 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74   lbl);.    sqlit
5e80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5e90: 50 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c 49 54  P_Integer, SQLIT
5ea0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
5eb0: 4f 52 4d 41 54 2c 20 30 29 3b 0a 20 20 20 20 73  ORMAT, 0);.    s
5ec0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5ed0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
5ee0: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71   iDb, 1);.    sq
5ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5f00: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
5f10: 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73  ->enc, 0);.    s
5f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5f30: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
5f40: 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71   iDb, 4);.    sq
5f50: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
5f60: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a  Label(v, lbl);..
5f70: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
5f80: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
5f90: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
5fa0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
5fb0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
5fc0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
5fd0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
5fe0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
5ff0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
6000: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
6010: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
6020: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
6030: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
6040: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
6050: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6060: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
6070: 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  try is left on t
6080: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
6090: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ack..    ** The 
60a0: 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e  rowid value is n
60b0: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
60c0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e  e that sqlite3En
60d0: 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20  dTable will.    
60e0: 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ** generate..   
60f0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6100: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
6110: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
6120: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6130: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6140: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6150: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
6160: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6180: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
6190: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
61a0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
61b0: 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a  rTable(v, iDb);.
61c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
61d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  ddOp(v, OP_NewRo
61e0: 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  wid, 0, 0);.    
61f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6200: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
6210: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6220: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
6230: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ll, 0, 0);.    s
6240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6250: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
6260: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6270: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6280: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
6290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62a0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
62b0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
62c0: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
62d0: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
62e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
62f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6300: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
6310: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
6320: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  ror:.  sqliteFre
6330: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
6340: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
6350: 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  s macro is used 
6360: 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73  to compare two s
6370: 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65  trings in a case
6380: 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e  -insensitive man
6390: 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c  ner..** It is sl
63a0: 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
63b0: 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  an calling sqlit
63c0: 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65  e3StrICmp() dire
63d0: 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f  ctly, but.** pro
63e0: 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64  duces larger cod
63f0: 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  e..**.** WARNING
6400: 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  : This macro is 
6410: 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77  not compatible w
6420: 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29  ith the strcmp()
6430: 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72   family. It.** r
6440: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
6450: 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61  he two strings a
6460: 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77  re equal, otherw
6470: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64  ise false..*/.#d
6480: 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c  efine STRICMP(x,
6490: 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70   y) (\.sqlite3Up
64a0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
64b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29  igned char *)(x)
64c0: 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55  ]==   \.sqlite3U
64d0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
64e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79  signed char *)(y
64f0: 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69  )]     \.&& sqli
6500: 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31  te3StrICmp((x)+1
6510: 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a  ,(y)+1)==0 )../*
6520: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
6530: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
6540: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
6550: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
6560: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
6570: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
6580: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
6590: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
65a0: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
65b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
65c0: 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72  nt.  sqlite3Star
65d0: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
65e0: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
65f0: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
6600: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
6610: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6620: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
6630: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
6640: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  te3AddColumn(Par
6650: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
6660: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
6670: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
6680: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c    char *z;.  Col
6690: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
66a0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
66b0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
66c0: 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
66d0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
66e0: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
66f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6700: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
6710: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
6720: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
6730: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
6740: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
6750: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6760: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
6770: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
6780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6790: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
67a0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
67b0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
67c0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
67d0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
67e0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
67f0: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
6800: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
6810: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
6820: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
6830: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
6840: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
6850: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
6860: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
6870: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
6880: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
6890: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
68a0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
68b0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
68c0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
68d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
68e0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
68f0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
6900: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
6910: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
6920: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
6930: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
6940: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
6950: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
6960: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
6970: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
6980: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
6990: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
69a0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
69b0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43  E_AFF_NONE;.  pC
69c0: 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72  ol->pColl = pPar
69d0: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
69e0: 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  l;.  p->nCol++;.
69f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6a00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6a10: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
6a20: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
6a30: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
6a40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6a50: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
6a60: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
6a70: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
6a80: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
6a90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
6aa0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
6ab0: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
6ac0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
6ad0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
6ae0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
6af0: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
6b00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
6b10: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
6b20: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
6b30: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
6b40: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
6b50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
6b60: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
6b70: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
6b80: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
6b90: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
6ba0: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
6bb0: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
6bc0: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
6bd0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
6be0: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
6bf0: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
6c00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
6c10: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
6c20: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
6c30: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
6c40: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
6c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
6c60: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
6c70: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
6c80: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
6c90: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
6ca0: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
6cb0: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
6cc0: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
6cd0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
6ce0: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
6cf0: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
6d00: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
6d10: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
6d20: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
6d30: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
6d40: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
6d50: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
6d60: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
6d70: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
6d80: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
6db0: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
6dc0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
6dd0: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
6de0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
6df0: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
6e00: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
6e10: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
6e20: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
6e30: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
6e40: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
6e50: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20  ITE_AFF_NONE.** 
6e60: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
6e70: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
6e80: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
6e90: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
6ea0: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
6eb0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
6ec0: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
6ed0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
6ee0: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
6ef0: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
6f00: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
6f10: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
6f20: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
6f30: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
6f40: 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  pe(const Token *
6f50: 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20  pType){.  u32 h 
6f60: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
6f70: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
6f80: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  ERIC;.  const un
6f90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
6fa0: 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63   = pType->z;.  c
6fb0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6fc0: 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70  ar *zEnd = &pTyp
6fd0: 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a  e->z[pType->n];.
6fe0: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a  .  while( zIn!=z
6ff0: 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  End ){.    h = (
7000: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
7010: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e  pperToLower[*zIn
7020: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
7030: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
7040: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
7050: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
7060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
7070: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
7080: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7090: 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T; .    }else if
70a0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
70b0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
70c0: 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20  8)+'b') ){      
70d0: 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* CLOB */.    
70e0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
70f0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
7100: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c  se if( h==(('t'<
7110: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
7120: 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'x'<<8)+'t') ){ 
7130: 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f        /* TEXT */
7140: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7150: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
7160: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7170: 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('b'<<24)+('l'<<
7180: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
7190: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c  )          /* BL
71a0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OB */.        &&
71b0: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
71c0: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
71d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
71e0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  L) ){.      aff 
71f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7200: 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
7210: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
7220: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
7230: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
7240: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
7250: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
7260: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
7270: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
7280: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7290: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
72a0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
72b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
72c0: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
72d0: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
72e0: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
72f0: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
7300: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
7310: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
7320: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7330: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
7340: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7350: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
7360: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
7370: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
7380: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
7390: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
73a0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
73b0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
73c0: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
73d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
73e0: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
73f0: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
7400: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
7410: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7420: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7430: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
7440: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
7450: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
7460: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7470: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7480: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7490: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
74a0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
74b0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
74c0: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
74d0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
74e0: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
74f0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
7500: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
7510: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
7520: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
7530: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
7540: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
7550: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
7560: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
7570: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
7580: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
7590: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
75a0: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
75b0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
75c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
75d0: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
75e0: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
75f0: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
7600: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
7610: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
7620: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
7630: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7640: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
7650: 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70  *pCol;..  if( (p
7660: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7670: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7680: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
7690: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
76a0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
76b0: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
76c0: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
76d0: 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d  >zType);.  pCol-
76e0: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
76f0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
7700: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
7710: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
7720: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79  AffinityType(pTy
7730: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
7740: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7750: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
7760: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
7770: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
7780: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
7790: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
77a0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
77b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
77c0: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
77d0: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
77e0: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
77f0: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
7800: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
7810: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
7820: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7830: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
7840: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
7850: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
7860: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
7870: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
7880: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
7890: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
78a0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
78b0: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
78c0: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
78d0: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
78e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
78f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
7900: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
7910: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
7920: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
7930: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
7940: 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  on(pExpr) ){.   
7950: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7960: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
7970: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
7980: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
7990: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
79a0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
79b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
79c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
79d0: 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c  elete(pCol->pDfl
79e0: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
79f0: 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  pDflt = sqlite3E
7a00: 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20  xprDup(pExpr);. 
7a10: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
7a20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
7a30: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pr);.}../*.** De
7a40: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
7a50: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
7a60: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
7a70: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
7a80: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
7a90: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
7aa0: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
7ab0: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
7ac0: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
7ad0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
7ae0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
7af0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
7b00: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
7b10: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
7b20: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
7b30: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
7b40: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
7b50: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
7b60: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
7b70: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
7b80: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
7b90: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
7ba0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
7bb0: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
7bc0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
7bd0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
7be0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
7bf0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
7c00: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
7c10: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
7c20: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
7c30: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
7c40: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
7c50: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
7c60: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
7c70: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
7c80: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
7c90: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
7ca0: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
7cb0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
7cc0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
7cd0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
7ce0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
7cf0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
7d00: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
7d10: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
7d20: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
7d30: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
7d40: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
7d50: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
7d60: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
7d70: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
7d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
7d90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
7da0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
7db0: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
7dc0: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
7dd0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
7de0: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
7df0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
7e00: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
7e10: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
7e20: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
7e30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7e40: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
7e50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
7e60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
7e70: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
7e80: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
7e90: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
7ea0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
7eb0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
7ec0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
7ed0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
7ee0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
7ef0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
7f00: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
7f10: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
7f20: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
7f30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7f40: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
7f50: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
7f60: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
7f70: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
7f80: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
7f90: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
7fa0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
7fb0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
7fc0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
7fd0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
7fe0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
7ff0: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
8000: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
8010: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
8020: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8030: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
8040: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
8050: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
8060: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
8070: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8080: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
8090: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
80a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
80b0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
80c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
80d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
80e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
80f0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
8100: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
8110: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
8120: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8130: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
8140: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
8150: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
8160: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
8170: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
8180: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
8190: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
81a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
81b0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
81c0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
81d0: 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ER")==0.        
81e0: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
81f0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
8200: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
8210: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
8220: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
8230: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
8240: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
8250: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
8260: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
8270: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8280: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
8290: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
82a0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
82b0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
82c0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
82d0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
82e0: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
82f0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
8300: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
8310: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
8320: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
8330: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
8340: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
8350: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
8360: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
8370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8380: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
8390: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
83a0: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
83b0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
83c0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
83d0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
83e0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
83f0: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
8400: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
8410: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
8420: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8430: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
8440: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
8450: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
8460: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
8470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
8480: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
8490: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
84a0: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  le;.  if( pTab )
84b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45  {.    /* The CHE
84c0: 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  CK expression mu
84d0: 73 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64  st be duplicated
84e0: 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20   so that tokens 
84f0: 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  refer.    ** to 
8500: 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61  malloced space a
8510: 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65  nd not the (ephe
8520: 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74  meral) text of t
8530: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a  he CREATE TABLE.
8540: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
8550: 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   */.    pTab->pC
8560: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
8570: 70 72 41 6e 64 28 70 54 61 62 2d 3e 70 43 68 65  prAnd(pTab->pChe
8580: 63 6b 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  ck, sqlite3ExprD
8590: 75 70 28 70 43 68 65 63 6b 45 78 70 72 29 29 3b  up(pCheckExpr));
85a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
85b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
85c0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a  pCheckExpr);.}..
85d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
85e0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
85f0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
8600: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
8610: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
8620: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
8630: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8640: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
8650: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8660: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
8670: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
8680: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64   Table *p;.  Ind
8690: 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c  ex *pIdx;.  Coll
86a0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
86b0: 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  t i;..  if( (p =
86c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
86d0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
86e0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
86f0: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
8700: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
8710: 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c  q(pParse, zType,
8720: 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43   nType);.  p->aC
8730: 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43  ol[i].pColl = pC
8740: 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  oll;..  /* If th
8750: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
8760: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
8770: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
8780: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a  ATE <type>",.  *
8790: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
87a0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
87b0: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
87c0: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
87d0: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
87e0: 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43  ype was added. C
87f0: 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69  orrect this if i
8800: 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  t is the case.. 
8810: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d   */.  for(pIdx =
8820: 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78   p->pIndex; pIdx
8830: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
8840: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
8850: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
8860: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  1 );.    if( pId
8870: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
8880: 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  i ) pIdx->keyInf
8890: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f  o.aColl[0] = pCo
88a0: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll;.  }.}../*.**
88b0: 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65   Call sqlite3Che
88c0: 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20  ckCollSeq() for 
88d0: 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  all collating se
88e0: 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e  quences in an in
88f0: 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  dex,.** in order
8900: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
8910: 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72  all the necessar
8920: 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  y collating sequ
8930: 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61  ences are.** loa
8940: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
8950: 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c  te3CheckIndexCol
8960: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
8970: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
8980: 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a  {.  if( pIdx ){.
8990: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
89a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
89b0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
89c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
89d0: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
89e0: 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e  rse, pIdx->keyIn
89f0: 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a  fo.aColl[i]) ){.
8a00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
8a10: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
8a20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8a30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8a40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
8a50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
8a60: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
8a70: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74  sequence for dat
8a80: 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78  abase native tex
8a90: 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64  t.** encoding id
8aa0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
8ab0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65  string zName, le
8ac0: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a  ngth nName..**.*
8ad0: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
8ae0: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
8af0: 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61  uence is not ava
8b00: 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61  ilable, or not a
8b10: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74  vailable.** in t
8b20: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  he database nati
8b30: 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  ve encoding, the
8b40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
8b50: 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  ry is invoked to
8b60: 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20  .** request it. 
8b70: 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  If the collation
8b80: 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f   factory does no
8b90: 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20  t supply such a 
8ba0: 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64  sequence,.** and
8bb0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73   the sequence is
8bc0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e   available in an
8bd0: 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64  other text encod
8be0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69  ing, then that i
8bf0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e  s.** returned in
8c00: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
8c10: 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  no versions of t
8c20: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
8c30: 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65  lations sequence
8c40: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
8c50: 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72  or.** another er
8c60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
8c70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
8c80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8c90: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  e written into.*
8ca0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c  * pParse..*/.Col
8cb0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63  lSeq *sqlite3Loc
8cc0: 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ateCollSeq(Parse
8cd0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
8ce0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
8cf0: 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74   nName){.  sqlit
8d00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8d10: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
8d20: 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e  db->enc;.  u8 in
8d30: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
8d40: 74 2e 62 75 73 79 3b 0a 0a 20 20 43 6f 6c 6c 53  t.busy;..  CollS
8d50: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
8d60: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
8d70: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
8d80: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
8d90: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
8da0: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
8db0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
8dc0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
8dd0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62  te3GetCollSeq(db
8de0: 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20  , pColl, zName, 
8df0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
8e00: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
8e10: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20  if( nName<0 ){. 
8e20: 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73         nName = s
8e30: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
8e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8e60: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
8e70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
8e80: 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a   %.*s", nName, z
8e90: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
8ea0: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
8eb0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  }..  return pCol
8ec0: 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  l;.}.../*.** Gen
8ed0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8ee0: 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74  will increment t
8ef0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
8f00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
8f10: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
8f20: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
8f30: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
8f40: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
8f50: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
8f60: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
8f70: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
8f80: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
8f90: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
8fa0: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
8fb0: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
8fc0: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
8fd0: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
8fe0: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
8ff0: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9000: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
9010: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
9020: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
9030: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
9040: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
9050: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
9060: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
9070: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
9080: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
9090: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
90a0: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
90b0: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
90c0: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
90d0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
90e0: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
90f0: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
9100: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
9110: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
9120: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
9130: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
9140: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
9150: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
9160: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
9170: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
9180: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
9190: 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ugh..*/.void sql
91a0: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
91b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
91c0: 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b  be *v, int iDb){
91d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
91e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
91f0: 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  r, db->aDb[iDb].
9200: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
9210: 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20  cookie+1, 0);.  
9220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9230: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
9240: 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  , iDb, 0);.}../*
9250: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
9260: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
9270: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
9280: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
9290: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
92a0: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
92b0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
92c0: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
92d0: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
92e0: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
92f0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
9300: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
9310: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
9320: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
9330: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
9340: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
9350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
9360: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
9370: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
9380: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
9390: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
93a0: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
93b0: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
93c0: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
93d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
93e0: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
93f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
9400: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
9410: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
9420: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
9430: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
9440: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
9450: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
9460: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
9470: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9480: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
9490: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
94a0: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
94b0: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
94c0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
94d0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
94e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
94f0: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
9500: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
9510: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
9520: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
9530: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
9540: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
9550: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
9560: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
9570: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
9580: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
9590: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
95a0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
95b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
95c0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
95d0: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
95e0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
95f0: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
9600: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
9610: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
9620: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
9630: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
9640: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
9650: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
9660: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
9670: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
9680: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
9690: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
96a0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
96b0: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
96c0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
96d0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
96e0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
96f0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
9700: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
9710: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
9720: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
9730: 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 73 54  able *p, int isT
9740: 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b  emp){.  int i, k
9750: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
9760: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
9770: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
9780: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
9790: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
97a0: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
97b0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
97c0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
97d0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
97e0: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
97f0: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
9800: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
9810: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
9820: 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31  = (strlen(z) + 1
9830: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
9840: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
9850: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
9860: 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<50 ){.    zSe
9870: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
9880: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
9890: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
98a0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
98b0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
98c0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
98d0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
98e0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
98f0: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
9900: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
9910: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
9920: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  mt==0 ) return 0
9930: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74  ;.  strcpy(zStmt
9940: 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26  , !OMIT_TEMPDB&&
9950: 69 73 54 65 6d 70 20 3f 20 22 43 52 45 41 54 45  isTemp ? "CREATE
9960: 20 54 45 4d 50 20 54 41 42 4c 45 20 22 3a 22 43   TEMP TABLE ":"C
9970: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
9980: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
9990: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
99a0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
99b0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
99c0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
99d0: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
99e0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
99f0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
9a00: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
9a10: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
9a20: 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b  = strlen(&zStmt[
9a30: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
9a40: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
9a50: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
9a60: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
9a70: 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e   if( (z = pCol->
9a80: 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20  zType)!=0 ){.   
9a90: 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20     zStmt[k++] = 
9aa0: 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70  ' ';.      strcp
9ab0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b  y(&zStmt[k], z);
9ac0: 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  .      k += strl
9ad0: 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  en(z);.    }.  }
9ae0: 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74  .  strcpy(&zStmt
9af0: 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  [k], zEnd);.  re
9b00: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
9b10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9b20: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
9b30: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
9b40: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
9b50: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
9b60: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9b70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
9b80: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
9b90: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
9ba0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
9bb0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
9bc0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
9bd0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
9be0: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
9bf0: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
9c00: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
9c10: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
9c20: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
9c30: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
9c40: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
9c50: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
9c60: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
9c70: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
9c80: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
9c90: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
9ca0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
9cb0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
9cc0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
9cd0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
9ce0: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
9cf0: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
9d00: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
9d10: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
9d20: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
9d30: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
9d40: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
9d50: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
9d60: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
9d70: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
9d80: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
9d90: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
9da0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
9db0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
9dc0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
9dd0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
9de0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
9df0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
9e00: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
9e10: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
9e20: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
9e30: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
9e40: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
9e50: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
9e60: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
9e70: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
9e80: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
9e90: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
9ea0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
9eb0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9ec0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
9ed0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
9ee0: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
9ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9f00: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
9f10: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
9f20: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
9f30: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
9f40: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c      /* The final
9f50: 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68   ')' token in th
9f60: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a  e CREATE TABLE *
9f70: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
9f80: 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ect         /* S
9f90: 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52  elect from a "CR
9fa0: 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  EATE ... AS SELE
9fb0: 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  CT" */.){.  Tabl
9fc0: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *p;.  sqlite3 
9fd0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9fe0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
9ff0: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
a000: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70  pSelect==0) || p
a010: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
a020: 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c  qlite3Tsd()->mal
a030: 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20  locFailed ) {.  
a040: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a050: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
a060: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
a070: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
a080: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
a090: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
a0a0: 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  t );..  iDb = sq
a0b0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
a0c0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
a0d0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
a0e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a0f0: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
a100: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
a110: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
a120: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
a130: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
a140: 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  eck ){.    SrcLi
a150: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
a160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
a170: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
a180: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a190: 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
a1a0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
a1b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a1c0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
a1d0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
a1e0: 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  ..    memset(&sN
a1f0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
a200: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
a210: 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSrc, 0, sizeof(
a220: 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63  sSrc));.    sSrc
a230: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73  .nSrc = 1;.    s
a240: 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  Src.a[0].zName =
a250: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73   p->zName;.    s
a260: 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  Src.a[0].pTab = 
a270: 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  p;.    sSrc.a[0]
a280: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
a290: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
a2a0: 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
a2b0: 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63  pSrcList = &sSrc
a2c0: 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63  ;.    sNC.isChec
a2d0: 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73  k = 1;.    if( s
a2e0: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
a2f0: 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
a300: 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20  pCheck) ){.     
a310: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
a320: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
a330: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a340: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
a350: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
a360: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
a370: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
a380: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
a390: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
a3a0: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
a3b0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
a3c0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
a3d0: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
a3e0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
a3f0: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
a400: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
a410: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
a420: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
a430: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
a440: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
a450: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
a460: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
a470: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
a480: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
a490: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
a4a0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
a4b0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
a4c0: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
a4d0: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
a4e0: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
a4f0: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
a500: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
a510: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
a520: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
a530: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
a540: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
a550: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
a560: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
a570: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
a580: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
a590: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
a5a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
a5b0: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
a5c0: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
a5d0: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
a5e0: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
a5f0: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
a600: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
a610: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
a620: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
a630: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
a640: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
a650: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
a660: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
a670: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
a680: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
a690: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
a6a0: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
a6b0: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
a6c0: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
a6d0: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
a6e0: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
a6f0: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
a700: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a710: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a720: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
a730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a740: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
a750: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
a760: 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
a770: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
a780: 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20   table and push 
a790: 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  it onto the stac
a7a0: 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77  k..    ** A view
a7b0: 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65   has no rootpage
a7c0: 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61  , so just push a
a7d0: 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73   zero onto the s
a7e0: 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  tack for.    ** 
a7f0: 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69  views.  Initiali
a800: 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20  ze zType at the 
a810: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a  same time..    *
a820: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
a830: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
a840: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
a850: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
a860: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
a870: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
a880: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
a890: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
a8a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a8b0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
a8c0: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
a8d0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
a8e0: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
a8f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a900: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
a910: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
a920: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
a930: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
a940: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
a950: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
a960: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
a970: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
a980: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
a990: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
a9a0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
a9b0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
a9c0: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
a9d0: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
a9e0: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
a9f0: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
aa00: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
aa10: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
aa20: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
aa30: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
aa40: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
aa50: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
aa60: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
aa70: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
aa80: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
aa90: 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  elTab;.      sql
aaa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aab0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
aac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aad0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
aae0: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
aaf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ab00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
ab10: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
ab20: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
ab30: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
ab40: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
ab50: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
ab60: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
ab70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
ab80: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ab90: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
aba0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
abb0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
abc0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
abd0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
abe0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
abf0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
ac00: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
ac10: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
ac20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ac30: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
ac40: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
ac50: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
ac60: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
ac70: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
ac80: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
ac90: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
aca0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
acb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
acc0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
acd0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
ace0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
acf0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
ad00: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
ad10: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
ad20: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
ad30: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
ad40: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
ad50: 61 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70  ableStmt(p, p->p
ad60: 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e  Schema==pParse->
ad70: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
ad80: 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ma);.    }else{.
ad90: 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e        n = pEnd->
ada0: 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
adb0: 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20  eToken.z + 1;.  
adc0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
add0: 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41  te3MPrintf("CREA
ade0: 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79  TE %s %.*s", zTy
adf0: 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e  pe2, n, pParse->
ae00: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
ae10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
ae20: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
ae30: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
ae40: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
ae50: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
ae60: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
ae70: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
ae80: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
ae90: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
aea0: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
aeb0: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
aec0: 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  ted.  The rowid 
aed0: 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63  for the prealloc
aee0: 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74  ated.    ** slot
aef0: 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d   is the 2nd item
af00: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
af10: 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  The top of the s
af20: 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20  tack is the.    
af30: 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  ** root page for
af40: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
af50: 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69  or a 0 if this i
af60: 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a  s a view)..    *
af70: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
af80: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
af90: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
afa0: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
afb0: 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
afc0: 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
afd0: 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
afe0: 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  0, sql=%Q ".    
aff0: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
b000: 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  #1",.      db->a
b010: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
b020: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
b030: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
b040: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
b050: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
b060: 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
b070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
b080: 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (zStmt);.    sql
b090: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
b0a0: 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23  (db, v, iDb);..#
b0b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b0c0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
b0d0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
b0e0: 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
b0f0: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
b100: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
b110: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
b120: 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
b130: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
b140: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
b150: 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  ( p->autoInc ){.
b160: 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
b170: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
b180: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
b190: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
b1a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
b1b0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
b1c0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
b1d0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
b1e0: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
b1f0: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
b200: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
b210: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
b220: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
b230: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
b240: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
b250: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
b260: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
b270: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
b280: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
b290: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
b2a0: 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73  Db, 0,.        s
b2b0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74  qlite3MPrintf("t
b2c0: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d  bl_name='%q'",p-
b2d0: 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
b2e0: 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  MIC);.  }...  /*
b2f0: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
b300: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
b310: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
b320: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
b330: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
b340: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
b350: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
b360: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
b370: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
b380: 20 0a 20 20 20 20 44 62 53 63 68 65 6d 61 20 2a   .    DbSchema *
b390: 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
b3a0: 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  hema;.    pOld =
b3b0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
b3c0: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
b3d0: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
b3e0: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
b3f0: 2b 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  +1,p);.    if( p
b400: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
b410: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
b420: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
b430: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
b440: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
b450: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
b460: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
b480: 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70  GN_KEY.    for(p
b490: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
b4a0: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
b4b0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
b4c0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
b4d0: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
b4e0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
b4f0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
b500: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
b510: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70  Schema->aFKey, p
b520: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b  FKey->zTo, nTo);
b530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61  .      sqlite3Ha
b540: 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
b550: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  a->aFKey, pFKey-
b560: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79  >zTo, nTo, pFKey
b570: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
b580: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
b590: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
b5a0: 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20  b->nTable++;.   
b5b0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
b5c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
b5d0: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
b5e0: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
b5f0: 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
b600: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
b610: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
b620: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
b630: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
b640: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70 43  pCons->z==0 ) pC
b650: 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
b660: 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
b670: 74 20 3d 20 31 33 20 2b 20 28 70 43 6f 6e 73 2d  t = 13 + (pCons-
b680: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
b690: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
b6a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
b6b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6c0: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
b6d0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
b6e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
b6f0: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
b700: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
b710: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
b720: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
b730: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
b740: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
b750: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
b760: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
b770: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
b780: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
b790: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
b7a0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
b7b0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
b7c0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
b7d0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
b7e0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
b7f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
b800: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
b810: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
b820: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
b830: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
b840: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
b850: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
b860: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
b870: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20  .  int isTemp   
b880: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
b890: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
b8a0: 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ew */.){.  Table
b8b0: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
b8c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
b8d0: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
b8e0: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
b8f0: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
b900: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b  Name;.  int iDb;
b910: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
b920: 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71  nVar>0 ){.    sq
b930: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b940: 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72  arse, "parameter
b950: 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
b960: 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20  d in views");.  
b970: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
b980: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
b990: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b9a0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
b9b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67  ble(pParse, pBeg
b9c0: 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  in, pName1, pNam
b9d0: 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
b9e0: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
b9f0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
ba00: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
ba10: 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
ba20: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
ba30: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
ba40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
ba50: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
ba60: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
ba70: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
ba80: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
ba90: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
baa0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53  Parse->db, p->pS
bab0: 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71  chema);.  if( sq
bac0: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
bad0: 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
bae0: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
baf0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
bb00: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
bb10: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
bb20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
bb30: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
bb40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
bb50: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
bb60: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
bb70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
bb80: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
bb90: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
bba0: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
bbb0: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
bbc0: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
bbd0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
bbe0: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
bbf0: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
bc00: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
bc10: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
bc20: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
bc30: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
bc40: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
bc50: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
bc60: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
bc70: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
bc80: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65  te3SelectDup(pSe
bc90: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
bca0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
bcb0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 73 71 6c  lect);.  if( sql
bcc0: 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
bcd0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
bce0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
bcf0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
bd00: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
bd10: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
bd20: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
bd30: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
bd40: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
bd50: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
bd60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
bd70: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
bd80: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
bd90: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
bda0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
bdb0: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
bdc0: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
bdd0: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
bde0: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
bdf0: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
be00: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
be10: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
be20: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
be30: 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b  char*)pBegin->z;
be40: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
be50: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
be60: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
be70: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
be80: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
be90: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
bea0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
beb0: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
bec0: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
bed0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
bee0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
bef0: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
bf00: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
bf10: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
bf20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bf30: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64  T_VIEW */..#ifnd
bf40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
bf50: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  IEW./*.** The Ta
bf60: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
bf70: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
bf80: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
bf90: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
bfa0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
bfb0: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
bfc0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
bfd0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
bfe0: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
bff0: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
c000: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
c010: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
c020: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
c030: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c040: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
c050: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
c060: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
c070: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
c080: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
c090: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
c0a0: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
c0b0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
c0c0: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
c0d0: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
c0e0: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
c0f0: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
c100: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
c110: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c120: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
c130: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
c140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
c150: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
c160: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
c170: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
c180: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  /..  assert( pTa
c190: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
c1a0: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
c1b0: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
c1c0: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
c1d0: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
c1e0: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
c1f0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
c200: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
c210: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
c220: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
c230: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
c240: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
c250: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
c260: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
c270: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
c280: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
c290: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
c2a0: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
c2b0: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
c2c0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
c2d0: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
c2e0: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
c2f0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
c300: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
c310: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
c320: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
c330: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
c340: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
c350: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
c360: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
c370: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
c380: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
c390: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
c3a0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
c3b0: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
c3c0: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
c3d0: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
c3e0: 66 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20  fe..  */.#if 0. 
c3f0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
c400: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
c410: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c420: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
c430: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
c440: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
c450: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
c460: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
c470: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
c480: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
c490: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
c4a0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
c4b0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
c4c0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
c4d0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
c4e0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
c4f0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
c500: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
c510: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
c520: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
c530: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
c540: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
c550: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
c560: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
c570: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
c580: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
c590: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
c5a0: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
c5b0: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
c5c0: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
c5d0: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
c5e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
c5f0: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
c600: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
c610: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
c620: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c630: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
c640: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
c650: 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70  ectDup(pTable->p
c660: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70  Select);.  if( p
c670: 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  Sel ){.    n = p
c680: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
c690: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
c6a0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
c6b0: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
c6c0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
c6d0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65  ol = -1;.    pSe
c6e0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
c6f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
c700: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29  pParse, 0, pSel)
c710: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  ;.    pParse->nT
c720: 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
c730: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
c740: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
c750: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
c760: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
c770: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
c780: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
c790: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
c7a0: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
c7b0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
c7c0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
c7d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
c7e0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
c7f0: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
c800: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
c810: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
c820: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
c830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
c840: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
c850: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
c860: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
c870: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c880: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
c890: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
c8a0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
c8b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c8c0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
c8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c8e0: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
c8f0: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
c900: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
c910: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
c920: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
c930: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
c940: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
c950: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
c960: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
c970: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
c980: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
c990: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
c9a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
c9b0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
c9c0: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
c9d0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
c9e0: 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
c9f0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
ca00: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
ca10: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
ca20: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
ca30: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
ca40: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
ca50: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
ca60: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
ca70: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
ca80: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
ca90: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
caa0: 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
cab0: 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
cac0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cad0: 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
cae0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
caf0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
cb00: 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
cb10: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
cb20: 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
cb30: 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
cb40: 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
cb50: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
cb60: 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
cb70: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
cb80: 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
cb90: 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
cba0: 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
cbb0: 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e   to iTo..*/.#ifn
cbc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cbd0: 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
cbe0: 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
cbf0: 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e  oved(Db *pDb, in
cc00: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
cc10: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
cc20: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
cc30: 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20  ash;..  pHash = 
cc40: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
cc50: 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
cc60: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
cc70: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
cc80: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
cc90: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
cca0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
ccb0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
ccc0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
ccd0: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
cce0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
ccf0: 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
cd00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
cd10: 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
cd20: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
cd30: 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
cd40: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
cd50: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
cd60: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
cd70: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
cd80: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
cd90: 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
cda0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
cdb0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
cdc0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
cdd0: 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
cde0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
cdf0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ce00: 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  (0);.}.#endif../
ce10: 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
ce20: 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
ce30: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
ce40: 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
ce50: 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
ce60: 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
ce70: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
ce80: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ce90: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
cea0: 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
ceb0: 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
cec0: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
ced0: 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
cee0: 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
cef0: 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
cf00: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
cf10: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
cf20: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
cf30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
cf40: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
cf50: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
cf60: 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
cf70: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
cf80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cf90: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
cfa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
cfb0: 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
cfc0: 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  iDb);.#ifndef SQ
cfd0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cfe0: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
cff0: 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69  troy pushes an i
d000: 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20  nteger onto the 
d010: 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69  stack. If this i
d020: 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
d030: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
d040: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
d050: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
d060: 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
d070: 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
d080: 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
d090: 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
d0a0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d0b0: 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
d0c0: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
d0d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20  *.  ** The "#0" 
d0e0: 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  in the SQL is a 
d0f0: 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74  special constant
d100: 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74   that means what
d110: 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ever value.  ** 
d120: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
d130: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65   the stack.  See
d140: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
d150: 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  Expr()..  */.  s
d160: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
d170: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
d180: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
d190: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
d1a0: 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70  ERE #0 AND rootp
d1b0: 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50  age=#0",.     pP
d1c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
d1d0: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
d1e0: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
d1f0: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ble);.#endif.}..
d200: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
d210: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
d220: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
d230: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
d240: 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
d250: 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
d260: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d270: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
d280: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
d290: 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
d2a0: 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
d2b0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
d2c0: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
d2d0: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
d2e0: 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
d2f0: 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
d300: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
d310: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
d320: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
d330: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
d340: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
d350: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
d360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
d370: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d380: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
d390: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
d3a0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
d3b0: 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  um, pTab->iDb);.
d3c0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
d3d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d3e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
d3f0: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
d400: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
d410: 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e  dx->tnum, pIdx->
d420: 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
d430: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
d440: 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
d450: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
d460: 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
d470: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
d480: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
d490: 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
d4a0: 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
d4b0: 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
d4c0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
d4d0: 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
d4e0: 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
d4f0: 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
d500: 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
d510: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
d520: 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
d530: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
d540: 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
d550: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
d560: 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
d570: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
d580: 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
d590: 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
d5a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
d5b0: 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
d5c0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
d5d0: 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
d5e0: 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
d5f0: 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
d600: 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
d610: 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
d620: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
d630: 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
d640: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
d650: 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
d660: 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
d670: 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
d680: 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
d690: 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
d6a0: 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
d6b0: 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
d6c0: 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
d6d0: 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
d6e0: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
d6f0: 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
d700: 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
d710: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
d720: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
d730: 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
d740: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
d750: 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
d760: 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
d770: 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
d780: 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
d790: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
d7a0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d7b0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
d7c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
d7d0: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
d7e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
d7f0: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
d800: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
d810: 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
d820: 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
d830: 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
d840: 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
d850: 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
d860: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
d870: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d880: 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
d890: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
d8b0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
d8c0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
d8d0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
d8e0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65  chema);.      de
d8f0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
d900: 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
d910: 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
d920: 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
d930: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
d940: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dif.}../*.** Thi
d950: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d960: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
d970: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
d980: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
d990: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
d9a0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
d9b0: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
d9c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
d9d0: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
d9e0: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
d9f0: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
da00: 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
da10: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
da20: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
da30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
da40: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
da50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
da60: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 73  Err || sqlite3Ts
da70: 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
da80: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  d ) goto exit_dr
da90: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65  op_table;.  asse
daa0: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
dab0: 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  =1 );.  pTab = s
dac0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
dad0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  e(pParse, pName-
dae0: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
daf0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
db00: 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  se);..  if( pTab
db10: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
db20: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  oErr ){.      sq
db30: 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28  lite3ErrorClear(
db40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
db50: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
db60: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
db70: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
db80: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
db90: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
dba0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
dbb0: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
dbc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dbd0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
dbe0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
dbf0: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
dc00: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
dc10: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
dc20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dc30: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
dc40: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
dc50: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
dc60: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
dc70: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
dc80: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
dc90: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
dca0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
dcb0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
dcc0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
dcd0: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
dce0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
dcf0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
dd00: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
dd10: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
dd20: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
dd30: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
dd40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
dd50: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
dd60: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
dd70: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
dd80: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
dd90: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
dda0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
ddb0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
ddc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ddd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
dde0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
ddf0: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
de00: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
de10: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
de20: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
de30: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
de40: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
de50: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
de60: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
de70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
de80: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
de90: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
dea0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
deb0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54  ->readOnly || pT
dec0: 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ab==db->aDb[iDb]
ded0: 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  .pSchema->pSeqTa
dee0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
def0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
df00: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
df10: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
df20: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
df30: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
df40: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
df50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
df60: 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
df70: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
df80: 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
df90: 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
dfa0: 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
dfb0: 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
dfc0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
dfd0: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
dfe0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
dff0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e000: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
e010: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
e020: 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
e030: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
e040: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e050: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
e060: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
e070: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
e080: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e090: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
e0a0: 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
e0b0: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
e0c0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
e0d0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e0e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
e0f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
e100: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
e110: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
e120: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
e130: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
e140: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e150: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
e160: 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
e170: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62  pTrigger;.    Db
e180: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
e190: 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
e1a0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
e1b0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
e1c0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44   iDb);..    /* D
e1d0: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
e1e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e1f0: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
e200: 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
e210: 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
e220: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
e230: 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
e240: 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
e250: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
e260: 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
e270: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
e280: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
e290: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
e2a0: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
e2b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e2c0: 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
e2d0: 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
e2e0: 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  a || .          
e2f0: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
e300: 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
e310: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73  chema );.      s
e320: 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
e330: 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
e340: 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  igger, 1);.     
e350: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
e360: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
e370: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
e380: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
e390: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d  EMENT.    /* Rem
e3a0: 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
e3b0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
e3c0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
e3d0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
e3e0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
e3f0: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
e400: 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
e410: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
e420: 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20  opped.    ** at 
e430: 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
e440: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
e450: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
e460: 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  le needs to.    
e470: 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
e480: 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
e490: 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
e4a0: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
e4b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e4c0: 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29   pTab->autoInc )
e4d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
e4e0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
e4f0: 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
e500: 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74  TE FROM %s.sqlit
e510: 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
e520: 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
e530: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
e540: 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
e550: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
e560: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
e570: 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
e580: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
e590: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
e5a0: 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
e5b0: 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
e5c0: 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
e5d0: 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
e5e0: 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
e5f0: 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
e600: 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
e610: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
e620: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
e630: 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
e640: 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
e650: 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
e660: 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
e670: 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
e680: 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
e690: 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
e6a0: 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
e6b0: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
e6c0: 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
e6d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
e6e0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
e6f0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
e700: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
e710: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
e720: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
e730: 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
e740: 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
e750: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45  pDb->zName, SCHE
e760: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
e770: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
e780: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
e790: 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62        destroyTab
e7a0: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
e7b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e7c0: 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
e7d0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69   entry from SQLi
e7e0: 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63  te's internal sc
e7f0: 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a  hema and modify.
e800: 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
e810: 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f  a cookie..    */
e820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e830: 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op3(v, OP_DropTa
e840: 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61  ble, iDb, 0, pTa
e850: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
e860: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
e870: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
e880: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  );.  }.  sqliteV
e890: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
e8a0: 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70  iDb);..exit_drop
e8b0: 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
e8c0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
e8d0: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
e8e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e8f0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e900: 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
e910: 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
e920: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
e930: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
e940: 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
e950: 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
e960: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
e970: 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
e980: 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
e990: 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
e9a0: 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
e9b0: 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
e9c0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e9d0: 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
e9e0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
e9f0: 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
ea00: 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
ea10: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
ea20: 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
ea30: 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
ea40: 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
ea50: 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
ea60: 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
ea70: 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
ea80: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
ea90: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
eaa0: 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
eab0: 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
eac0: 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
ead0: 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
eae0: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
eaf0: 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
eb00: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
eb10: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
eb20: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
eb30: 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
eb40: 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
eb50: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
eb60: 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
eb70: 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
eb80: 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
eb90: 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
eba0: 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
ebb0: 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
ebc0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
ebd0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
ebe0: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
ebf0: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
ec00: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
ec10: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
ec20: 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
ec30: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
ec40: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
ec50: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
ec60: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
ec70: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
ec80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ec90: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
eca0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
ecb0: 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
ecc0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
ecd0: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
ece0: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
ecf0: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
ed00: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
ed10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
ed20: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
ed30: 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
ed40: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
ed50: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
ed60: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
ed70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
ed80: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
ed90: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
eda0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
edb0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
edc0: 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
edd0: 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  y = 0;.  Table *
ede0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
edf0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
ee00: 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
ee10: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
ee20: 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
ee30: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
ee40: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
ee50: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
ee60: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
ee70: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
ee80: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
ee90: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
eea0: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
eeb0: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
eec0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
eed0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
eee0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
eef0: 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
ef00: 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
ef10: 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
ef20: 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
ef30: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
ef40: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
ef50: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
ef60: 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
ef70: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
ef80: 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
ef90: 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
efa0: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
efb0: 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
efc0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
efd0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
efe0: 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
eff0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
f000: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
f010: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
f020: 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
f030: 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
f040: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
f050: 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
f060: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
f070: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
f080: 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
f090: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
f0a0: 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a  (*pFKey) + nCol*
f0b0: 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
f0c0: 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
f0d0: 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
f0e0: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
f0f0: 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
f100: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
f110: 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70  Byte += strlen(p
f120: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
f130: 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
f140: 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
f150: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
f160: 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
f170: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
f180: 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
f190: 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
f1a0: 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
f1b0: 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
f1c0: 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46  )&pFKey[1];.  pF
f1d0: 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72  Key->aCol = (str
f1e0: 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a  uct sColMap*)z;.
f1f0: 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74    z += sizeof(st
f200: 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43  ruct sColMap)*nC
f210: 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  ol;.  pFKey->zTo
f220: 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
f230: 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
f240: 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
f250: 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e   0;.  z += pTo->
f260: 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  n+1;.  pFKey->pN
f270: 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b  extTo = 0;.  pFK
f280: 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
f290: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
f2a0: 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
f2b0: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
f2c0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
f2d0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
f2e0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
f2f0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
f300: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
f310: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
f320: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f330: 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
f340: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
f350: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
f360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f370: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
f380: 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
f390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f3a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f3b0: 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
f3c0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
f3d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f3e0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
f3f0: 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
f400: 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
f410: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
f420: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
f430: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
f440: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
f450: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
f460: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
f470: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
f480: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
f490: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
f4a0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43   n = strlen(pToC
f4b0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
f4c0: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
f4d0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
f4e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
f4f0: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
f500: 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
f510: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
f520: 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
f530: 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
f540: 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
f550: 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d  ey->deleteConf =
f560: 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20   flags & 0xff;. 
f570: 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f   pFKey->updateCo
f580: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38  nf = (flags >> 8
f590: 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b   ) & 0xff;.  pFK
f5a0: 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d  ey->insertConf =
f5b0: 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20   (flags >> 16 ) 
f5c0: 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69  & 0xff;..  /* Li
f5d0: 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
f5e0: 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
f5f0: 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
f600: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
f610: 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
f620: 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
f630: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46  .  sqliteFree(pF
f640: 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
f650: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f660: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f670: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
f680: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  prListDelete(pFr
f690: 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
f6a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
f6b0: 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
f6c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f6d0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
f6e0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
f6f0: 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
f700: 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
f710: 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
f720: 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
f730: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
f740: 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
f750: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
f760: 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
f770: 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
f780: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
f790: 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
f7a0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
f7b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
f7c0: 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
f7d0: 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
f7e0: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
f7f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
f800: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
f810: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
f820: 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
f830: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f840: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
f850: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
f860: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
f870: 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
f880: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
f890: 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
f8a0: 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
f8b0: 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  turn;.  pFKey->i
f8c0: 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65  sDeferred = isDe
f8d0: 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
f8e0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f8f0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f900: 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
f910: 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
f920: 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
f930: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
f940: 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
f950: 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
f960: 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
f970: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
f980: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
f990: 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
f9a0: 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
f9b0: 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
f9c0: 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
f9d0: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
f9e0: 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
f9f0: 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63  d.  The memory c
fa00: 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79  ell specified by
fa10: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
fa20: 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
fa30: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
fa40: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
fa50: 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
fa60: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
fa70: 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
fa80: 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
fa90: 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
faa0: 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
fab0: 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
fac0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
fad0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
fae0: 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
faf0: 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
fb00: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
fb10: 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
fb20: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
fb30: 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
fb40: 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
fb50: 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
fb60: 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
fb70: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
fb80: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
fb90: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
fba0: 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  >nTab;       /* 
fbb0: 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
fbc0: 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
fbd0: 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
fbe0: 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f  e->nTab+1;     /
fbf0: 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
fc00: 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
fc10: 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
fc40: 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
fc50: 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
fc80: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
fc90: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
fca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
fcb0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
fcc0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
fcd0: 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69  chine */.  int i
fce0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
fcf0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
fd00: 2d 3e 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  ->db, pIndex->pS
fd10: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
fd20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fd30: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
fd40: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
fd50: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
fd60: 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
fd70: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
fd80: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
fd90: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
fda0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
fdb0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
fdc0: 6e 73 75 72 65 20 61 6c 6c 20 74 68 65 20 72 65  nsure all the re
fdd0: 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  quired collation
fde0: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 61   sequences are a
fdf0: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20  vailable. This. 
fe00: 20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c   ** routine will
fe10: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c   invoke the coll
fe20: 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c  ation-needed cal
fe30: 6c 62 61 63 6b 20 69 66 20 6e 65 63 65 73 73 61  lback if necessa
fe40: 72 79 20 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20  ry (and.  ** if 
fe50: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 72 65 67  one has been reg
fe60: 69 73 74 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20  istered)..  */. 
fe70: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
fe80: 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 70 50  kIndexCollSeq(pP
fe90: 61 72 73 65 2c 20 70 49 6e 64 65 78 29 20 29 7b  arse, pIndex) ){
fea0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
feb0: 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
fec0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
fed0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
fee0: 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
fef0: 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
ff00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ff10: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
ff20: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29   memRootPage, 0)
ff30: 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a  ;.    tnum = 0;.
ff40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
ff50: 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
ff60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ff70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65  eAddOp(v, OP_Cle
ff80: 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
ff90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
ffa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ffb0: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
ffc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
ffd0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
ffe0: 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20   iIdx, tnum,.   
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
10010 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
10020 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
10030 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64  OpenTableForRead
10040 69 6e 67 28 76 2c 20 69 54 61 62 2c 20 69 44 62  ing(v, iTab, iDb
10050 2c 20 70 54 61 62 29 3b 0a 20 20 61 64 64 72 31  , pTab);.  addr1
10060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10070 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
10080 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
10090 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
100a0 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c  exKey(v, pIndex,
100b0 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70 49   iTab);.  if( pI
100c0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
100d0 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e  E_None ){.    in
100e0 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c 69  t curaddr = sqli
100f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10100 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 61  dr(v);.    int a
10110 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b 34  ddr2 = curaddr+4
10120 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10130 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75 72  eChangeP2(v, cur
10140 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b 0a  addr-1, addr2);.
10150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10160 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
10170 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
10180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10190 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
101a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
101b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
101c0 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c  _IsUnique, iIdx,
101d0 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
101e0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
101f0 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
10200 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41 62  ONSTRAINT, OE_Ab
10210 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
10220 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65           "indexe
10230 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  d columns are no
10240 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54  t unique", P3_ST
10250 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65 72  ATIC);.    asser
10260 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74 65  t( addr2==sqlite
10270 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10280 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (v) );.  }.  sql
10290 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
102a0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
102b0 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Idx, 0);.  sqlit
102c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
102d0 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
102e0 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
102f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10300 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
10310 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10320 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30  P_Close, iTab, 0
10330 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10340 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
10350 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a  e, iIdx, 0);.}..
10360 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
10370 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
10380 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
10390 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
103a0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
103b0 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
103c0 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
103d0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
103e0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
103f0 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
10400 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
10410 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
10420 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
10430 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
10440 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
10450 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
10460 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
10470 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
10480 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10490 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
104a0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
104b0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
104c0 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
104d0 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
104e0 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
104f0 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
10500 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
10510 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
10520 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
10530 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
10540 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
10550 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
10560 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
10570 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
10580 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
10590 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
105a0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
105b0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
105c0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
105d0 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
105e0 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
105f0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
10600 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
10610 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
10620 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
10630 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
10640 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
10650 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
10660 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
10670 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
10680 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
10690 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
106a0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
106b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
106c0 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
106d0 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
106e0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
106f0 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
10700 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
10710 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
10720 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
10730 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
10740 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
10750 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
10760 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
10770 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
10780 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
10790 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
107a0 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
107b0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
107c0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
107d0 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
107e0 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
107f0 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
10800 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
10810 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
10820 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
10830 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
10840 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
10850 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
10860 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20  t ifNotExist    
10870 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
10880 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
10890 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
108a0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
108b0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
108c0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
108d0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
108e0 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
108f0 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
10900 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
10910 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
10920 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
10930 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
10940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10950 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
10960 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
10970 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
10980 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
10990 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
109a0 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
109b0 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
109c0 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
109d0 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
109e0 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
109f0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
10a00 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
10a10 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
10a20 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
10a30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
10a40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10a50 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
10a60 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
10a70 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
10a80 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
10a90 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
10aa0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
10ab0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
10ac0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
10ad0 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
10ae0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
10af0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10b00 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
10b10 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
10b20 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
10b30 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
10b40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
10b50 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
10b60 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
10b70 70 4c 69 73 74 20 2a 2f 0a 0a 20 20 69 66 28 20  pList */..  if( 
10b80 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
10b90 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61  sqlite3Tsd()->ma
10ba0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
10bb0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10bc0 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  dex;..  /*.  ** 
10bd0 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
10be0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
10bf0 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
10c00 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
10c10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
10c20 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
10c30 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
10c40 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
10c50 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
10c60 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
10c70 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
10c80 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
10c90 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
10ca0 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
10cb0 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
10cc0 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
10cd0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
10ce0 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
10cf0 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
10d00 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
10d10 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
10d20 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
10d30 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
10d40 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10d50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66  eate_index;..#if
10d60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10d70 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
10d80 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
10d90 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
10da0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
10db0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
10dc0 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
10dd0 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
10de0 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20  database to 1.. 
10df0 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d     */.    pTab =
10e00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
10e10 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
10e20 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  blName);.    if(
10e30 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
10e40 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
10e50 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
10e60 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
10e70 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 69 44  hema ){.      iD
10e80 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  b = 1;.    }.#en
10e90 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
10ea0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
10eb0 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
10ec0 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
10ed0 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
10ee0 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
10ef0 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
10f00 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
10f10 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
10f20 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
10f30 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
10f40 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
10f50 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
10f60 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
10f70 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
10f80 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
10f90 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
10fa0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
10fb0 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  e(pParse, pTblNa
10fc0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
10fd0 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d  .        pTblNam
10fe0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
10ff0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  e);.    if( !pTa
11000 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
11010 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11020 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
11030 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54  iDb].pSchema==pT
11040 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
11050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
11060 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
11070 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
11080 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
11090 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
110a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
110b0 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20  ndex;.    iDb = 
110c0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
110d0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
110e0 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70  Schema);.  }.  p
110f0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
11100 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  b];..  if( pTab=
11110 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
11120 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
11130 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
11140 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
11150 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
11160 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11170 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
11180 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
11190 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
111a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
111b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
111c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
111d0 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
111e0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
111f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11200 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
11210 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
11220 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
11230 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11240 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
11250 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
11260 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
11270 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
11280 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
11290 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
112a0 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
112b0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
112c0 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
112d0 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
112e0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
112f0 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
11300 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
11310 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
11320 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11330 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
11340 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
11350 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
11360 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
11370 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
11380 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
11390 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
113a0 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
113b0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
113c0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
113d0 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
113e0 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
113f0 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
11400 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
11410 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
11420 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
11430 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
11440 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
11450 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
11460 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
11470 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
11480 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
11490 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
114a0 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
114b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
114c0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
114d0 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
114e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
114f0 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
11500 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11510 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11520 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
11530 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
11540 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
11550 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
11560 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11570 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11580 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
11590 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
115a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
115b0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
115c0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
115d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
115e0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
115f0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
11600 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d  zName, pDb->zNam
11610 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
11620 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
11630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11640 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11650 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
11660 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
11670 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
11680 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
11690 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
116a0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
116b0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
116c0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
116d0 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
116e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
116f0 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
11700 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
11710 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
11720 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
11730 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11740 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
11750 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
11760 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
11770 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
11780 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
11790 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
117a0 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
117b0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
117c0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
117d0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
117e0 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20  f,"_%d",n);.    
117f0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
11800 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
11810 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  &zName, "sqlite_
11820 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61  autoindex_", pTa
11830 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20  b->zName, zBuf, 
11840 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
11850 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
11860 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11870 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
11880 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
11890 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
118a0 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
118b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
118c0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
118d0 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
118e0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62   char *zDb = pDb
118f0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ->zName;.    if(
11900 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
11910 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
11920 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
11930 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a  TABLE(iDb), 0, z
11940 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
11950 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11960 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
11970 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
11980 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
11990 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
119a0 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c  iDb==1 ) i = SQL
119b0 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
119c0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
119d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
119e0 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
119f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
11a00 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
11a10 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11a20 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
11a30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
11a40 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
11a50 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
11a60 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
11a70 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
11a80 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
11a90 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
11aa0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
11ab0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11ac0 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
11ad0 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
11ae0 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
11af0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
11b00 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
11b10 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d  d.z = (u8*)pTab-
11b20 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
11b30 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
11b40 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
11b50 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a  ((char*)nullId.z
11b60 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
11b70 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
11b80 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c  pend(0, 0, &null
11b90 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  Id);.    if( pLi
11ba0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
11bb0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11bc0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
11bd0 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74  sortOrder = sort
11be0 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
11bf0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
11c00 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
11c10 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
11c20 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
11c30 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
11c40 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
11c50 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 6e 4e 61  eof(Index) + nNa
11c60 6d 65 20 2b 20 32 20 2b 20 73 69 7a 65 6f 66 28  me + 2 + sizeof(
11c70 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20  int) +.         
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11c90 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 20 2b 20  sizeof(int)*2 + 
11ca0 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
11cb0 20 2b 20 31 29 2a 70 4c 69 73 74 2d 3e 6e 45 78   + 1)*pList->nEx
11cc0 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  pr );.  if( sqli
11cd0 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
11ce0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  Failed ) goto ex
11cf0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11d00 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
11d10 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
11d20 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
11d30 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d  ll[pList->nExpr]
11d40 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ;.  pIndex->aiRo
11d50 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
11d60 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
11d70 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  umn[pList->nExpr
11d80 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
11d90 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
11da0 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4c  dex->aiRowEst[pL
11db0 69 73 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b 0a 20  ist->nExpr+1];. 
11dc0 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
11dd0 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 26 70  .aSortOrder = &p
11de0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61  Index->zName[nNa
11df0 6d 65 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28  me+1];.  strcpy(
11e00 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
11e10 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
11e20 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
11e30 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
11e40 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
11e50 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
11e60 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
11e70 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
11e80 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
11e90 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
11ea0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
11eb0 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43  pSchema;..  /* C
11ec0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
11ed0 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
11ee0 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
11ef0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
11f00 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
11f10 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
11f20 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
11f30 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
11f40 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
11f50 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
11f60 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
11f70 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
11f80 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
11f90 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
11fa0 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
11fb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
11fc0 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
11fd0 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
11fe0 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
11ff0 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
12000 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
12010 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
12020 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
12030 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
12040 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
12050 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
12060 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
12070 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
12080 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12090 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
120a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
120b0 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
120c0 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  ;.    int reques
120d0 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
120e0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43    for(j=0, pTabC
120f0 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
12100 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
12110 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
12120 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
12130 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c  trICmp(zColName,
12140 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29   pTabCol->zName)
12150 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12160 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
12170 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
12180 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12190 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
121a0 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
121b0 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
121c0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
121d0 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  , zColName);.   
121e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
121f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12200 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
12210 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
12220 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
12230 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >pExpr ){.      
12240 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65  assert( pListIte
12250 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  m->pExpr->pColl 
12260 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  );.      pIndex-
12270 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
12280 5d 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  ] = pListItem->p
12290 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
122a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
122b0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
122c0 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61  oll[i] = pTab->a
122d0 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20  Col[j].pColl;.  
122e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
122f0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
12300 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20  aColl[i] );.    
12310 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
12320 73 79 20 26 26 20 0a 20 20 20 20 20 20 20 20 73  sy && .        s
12330 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
12340 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  eq(pParse, pInde
12350 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
12360 5b 69 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  [i]) .    ){.   
12370 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12380 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12390 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
123a0 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
123b0 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
123c0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
123d0 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
123e0 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 5b 69  nfo.aSortOrder[i
123f0 5d 20 3d 20 72 65 71 75 65 73 74 65 64 53 6f 72  ] = requestedSor
12400 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 70 49  tOrder;.  }.  pI
12410 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
12420 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
12430 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  xpr;.  sqlite3De
12440 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
12450 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
12460 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
12470 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
12480 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
12490 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
124a0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
124b0 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
124c0 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
124d0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
124e0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
124f0 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
12500 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
12510 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
12520 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
12530 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
12540 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
12550 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
12560 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
12570 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
12580 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
12590 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
125a0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
125b0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
125c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
125d0 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
125e0 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
125f0 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
12600 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
12610 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
12620 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
12630 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
12640 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
12650 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
12660 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
12670 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
12680 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
12690 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
126a0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
126b0 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
126c0 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
126d0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
126e0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
126f0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
12700 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
12710 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
12720 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
12730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12740 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
12750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12760 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
12770 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
12780 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12790 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
127a0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
127b0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
127c0 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
127d0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
127e0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
127f0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
12800 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
12810 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
12820 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
12830 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
12840 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
12850 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
12860 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e   if( pIdx->keyIn
12870 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  fo.aSortOrder[k]
12880 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  !=pIndex->keyInf
12890 6f 2e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20  o.aSortOrder[k] 
128a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
128b0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
128c0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
128d0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
128e0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
128f0 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
12900 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
12910 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
12920 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
12930 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
12940 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
12950 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
12960 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
12970 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
12980 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
12990 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
129a0 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
129b0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
129c0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
129d0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
129e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
129f0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
12a00 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
12a10 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
12a20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
12a30 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
12a40 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
12a50 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
12a60 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
12a70 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
12a80 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
12a90 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
12aa0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
12ab0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
12ac0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
12ad0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
12ae0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
12af0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
12b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12b10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12b30 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
12b40 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
12b50 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
12b60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12b70 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
12b80 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
12b90 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
12ba0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
12bb0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
12bc0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
12bd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12be0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12bf0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12c00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12c10 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
12c20 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
12c30 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
12c40 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
12c50 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
12c60 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
12c70 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
12c80 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
12c90 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
12ca0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
12cb0 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
12cc0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
12cd0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
12cf0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
12d00 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
12d10 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
12d20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
12d30 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
12d40 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
12d50 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
12d60 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  d */.      goto 
12d70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12d80 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
12d90 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
12da0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
12db0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
12dc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
12dd0 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
12de0 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
12df0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
12e00 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
12e10 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
12e20 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
12e30 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
12e40 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
12e50 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
12e60 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
12e70 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
12e80 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
12e90 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
12ea0 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
12eb0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
12ec0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
12ed0 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
12ee0 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
12ef0 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
12f00 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
12f10 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
12f20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
12f30 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
12f40 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
12f50 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
12f60 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
12f70 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
12f80 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
12f90 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
12fa0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
12fb0 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
12fc0 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
12fd0 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
12fe0 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
12ff0 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
13000 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
13010 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
13020 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
13030 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
13040 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
13050 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
13060 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
13070 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
13080 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
13090 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
130a0 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
130b0 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
130c0 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
130d0 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
130e0 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
130f0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
13100 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
13110 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
13120 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
13130 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
13140 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  ++;..    v = sql
13150 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13160 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
13170 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
13180 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20  eate_index;...  
13190 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
131a0 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
131b0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
131c0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
131d0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
131e0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
131f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13200 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
13210 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ndex, iDb, 0);. 
13220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13230 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
13240 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20  re, iMem, 0);.. 
13250 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
13260 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
13270 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
13280 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
13290 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
132a0 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
132b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
132c0 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
132d0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
132e0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
132f0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
13300 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
13310 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
13320 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
13330 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
13340 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
13350 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
13360 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20   : " UNIQUE",.  
13370 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20        pEnd->z - 
13380 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20  pName->z + 1,.  
13390 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
133a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
133b0 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
133c0 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
133d0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
133e0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
133f0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
13400 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
13410 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
13420 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
13430 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13440 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
13450 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
13460 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
13470 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
13480 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13490 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
134a0 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
134b0 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
134c0 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20  ,%Q,#0,%Q);",.  
134d0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
134e0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
134f0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
13500 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
13510 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
13520 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
13530 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
13540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13550 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
13560 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
13570 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  ree(zStmt);..   
13580 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
13590 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
135a0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
135b0 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
135c0 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
135d0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
135e0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
135f0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
13600 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
13610 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13620 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
13630 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
13640 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
13650 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
13660 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
13670 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
13680 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
13690 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  a, iDb, 0,.     
136a0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
136b0 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  tf("name='%q'", 
136c0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
136d0 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
136e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
136f0 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  dOp(v, OP_Expire
13700 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
13710 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
13720 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
13730 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
13740 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
13750 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
13760 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
13770 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
13780 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
13790 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
137a0 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
137b0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
137c0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
137d0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
137e0 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
137f0 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
13800 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
13810 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
13820 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
13830 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
13840 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
13850 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
13860 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
13870 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
13880 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
13890 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
138a0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
138b0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
138c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
138d0 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
138e0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
138f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
13900 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
13910 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
13920 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
13930 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
13940 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
13950 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
13960 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
13970 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
13980 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
13990 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
139a0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
139b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
139c0 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
139d0 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
139e0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
139f0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
13a00 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
13a10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13a20 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
13a30 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
13a40 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
13a50 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
13a60 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
13a70 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
13a80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13a90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
13aa0 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62  file format numb
13ab0 65 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d  er is at least m
13ac0 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65  inFormat..** The
13ad0 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
13ae0 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68  will increase th
13af0 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75  e file format nu
13b00 6d 62 65 72 20 69 66 20 6e 65 63 65 73 73 61 72  mber if necessar
13b10 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
13b20 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72  e3MinimumFileFor
13b30 6d 61 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  mat(Parse *pPars
13b40 65 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  e, int iDb, int 
13b50 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64  minFormat){.  Vd
13b60 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
13b70 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13b80 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
13b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43  ddOp(v, OP_ReadC
13bb0 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a  ookie, iDb, 1);.
13bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13bd0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
13be0 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30  er, minFormat, 0
13bf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13c00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65  beAddOp(v, OP_Ge
13c10 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
13c20 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
13c30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13c40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
13c50 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
13c60 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13c70 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13c80 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
13c90 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
13ca0 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
13cb0 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
13cc0 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
13cd0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
13ce0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
13cf0 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
13d00 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
13d10 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
13d20 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
13d30 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
13d40 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
13d50 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
13d60 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
13d70 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
13d80 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
13d90 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
13da0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
13db0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
13dc0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
13dd0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
13de0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
13df0 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
13e00 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
13e10 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
13e20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
13e30 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
13e40 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
13e50 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
13e60 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
13e70 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
13e80 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
13e90 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
13ea0 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
13eb0 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
13ec0 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
13ed0 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
13ee0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
13ef0 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
13f00 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
13f10 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
13f20 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
13f30 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
13f40 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
13f50 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
13f60 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
13f70 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
13f80 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
13f90 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
13fa0 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
13fb0 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
13fc0 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
13fd0 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
13fe0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
13ff0 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
14000 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
14010 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  ed *a = pIdx->ai
14020 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
14030 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
14040 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
14050 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64  000;.  for(i=pId
14060 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31  x->nColumn; i>=1
14070 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i--){.    a[i]
14080 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28   = 10;.  }.  if(
14090 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
140a0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
140b0 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
140c0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
140d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
140e0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
140f0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
14100 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
14110 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
14120 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
14130 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
14140 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
14150 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14160 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
14170 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
14180 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
14190 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
141a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
141b0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
141c0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
141d0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
141e0 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
141f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
14200 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
14210 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14220 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
14230 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
14240 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
14250 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
14260 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14270 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
14280 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
14290 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
142a0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
142b0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
142c0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
142d0 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
142e0 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
142f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14300 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
14310 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
14320 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
14330 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
14340 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
14350 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14360 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
14370 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
14380 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
14390 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
143a0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
143b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
143c0 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
143d0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
143e0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
143f0 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
14400 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14410 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
14420 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
14430 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
14440 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
14450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14460 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
14470 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
14480 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14490 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
144a0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
144b0 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
144c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
144d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
144e0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
144f0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
14500 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
14510 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14520 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
14530 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
14540 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
14550 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
14560 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
14570 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
14580 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
14590 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
145a0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
145b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
145c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
145d0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
145e0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
145f0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
14600 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
14610 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
14620 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
14630 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
14640 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
14650 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
14660 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
14670 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14680 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14690 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   ){.    sqlite3N
146a0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
146b0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
146c0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
146d0 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
146e0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
146f0 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
14700 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
14710 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a    pIndex->zName.
14720 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
14730 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
14740 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
14750 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
14760 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
14770 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
14780 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
14790 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
147a0 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
147b0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
147c0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
147d0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
147e0 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
147f0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72 61 79  }../*.** ppArray
14800 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20 73   points into a s
14810 74 72 75 63 74 75 72 65 20 77 68 65 72 65 20 74  tructure where t
14820 68 65 72 65 20 69 73 20 61 6e 20 61 72 72 61 79  here is an array
14830 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f 6c 6c   pointer.** foll
14840 6f 77 65 64 20 62 79 20 74 77 6f 20 69 6e 74 65  owed by two inte
14850 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74 20  gers. The first 
14860 69 6e 74 65 67 65 72 20 69 73 20 74 68 65 0a 2a  integer is the.*
14870 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * number of elem
14880 65 6e 74 73 20 69 6e 20 74 68 65 20 73 74 72 75  ents in the stru
14890 63 74 75 72 65 20 61 72 72 61 79 2e 20 20 54 68  cture array.  Th
148a0 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
148b0 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65  .** is the numbe
148c0 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  r of allocated s
148d0 6c 6f 74 73 20 69 6e 20 74 68 65 20 61 72 72 61  lots in the arra
148e0 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  y..**.** In othe
148f0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 73 74 72  r words, the str
14900 75 63 74 75 72 65 20 6c 6f 6f 6b 73 20 73 6f 6d  ucture looks som
14910 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73  ething like this
14920 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 73  :.**.**        s
14930 74 72 75 63 74 20 45 78 61 6d 70 6c 65 31 20 7b  truct Example1 {
14940 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 74 72  .**          str
14950 75 63 74 20 73 75 62 45 6c 65 6d 20 2a 61 45 6e  uct subElem *aEn
14960 74 72 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20  try;.**         
14970 20 69 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a 2a 20   int nEntry;.** 
14980 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 6c           int nAl
14990 6c 6f 63 3b 0a 2a 2a 20 20 20 20 20 20 20 20 7d  loc;.**        }
149a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6e 45 6e 74  .**.** The pnEnt
149b0 72 79 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69  ry parameter poi
149c0 6e 74 73 20 74 6f 20 74 68 65 20 65 71 75 69 76  nts to the equiv
149d0 61 6c 65 6e 74 20 6f 66 20 45 78 61 6d 70 6c 65  alent of Example
149e0 31 2e 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  1.nEntry..**.** 
149f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
14a00 6f 63 61 74 65 73 20 61 20 6e 65 77 20 73 6c 6f  ocates a new slo
14a10 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 2c 20  t in the array, 
14a20 7a 65 72 6f 73 20 69 74 20 6f 75 74 2c 0a 2a 2a  zeros it out,.**
14a30 20 61 6e 64 20 72 65 74 75 72 6e 73 20 69 74 73   and returns its
14a40 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 61 6c 6c   index.  If mall
14a50 6f 63 20 66 61 69 6c 73 20 61 20 6e 65 67 61 74  oc fails a negat
14a60 69 76 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ive number is re
14a70 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a  turned..**.** sz
14a80 45 6e 74 72 79 20 69 73 20 74 68 65 20 73 69 7a  Entry is the siz
14a90 65 6f 66 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  eof of a single 
14aa0 61 72 72 61 79 20 65 6e 74 72 79 2e 20 20 69 6e  array entry.  in
14ab0 69 74 53 69 7a 65 20 69 73 20 74 68 65 20 0a 2a  itSize is the .*
14ac0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 72 61  * number of arra
14ad0 79 20 65 6e 74 72 69 65 73 20 61 6c 6c 6f 63 61  y entries alloca
14ae0 74 65 64 20 6f 6e 20 74 68 65 20 69 6e 69 74 69  ted on the initi
14af0 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  al allocation..*
14b00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 72 72  /.int sqlite3Arr
14b10 61 79 41 6c 6c 6f 63 61 74 65 28 76 6f 69 64 20  ayAllocate(void 
14b20 2a 2a 70 70 41 72 72 61 79 2c 20 69 6e 74 20 73  **ppArray, int s
14b30 7a 45 6e 74 72 79 2c 20 69 6e 74 20 69 6e 69 74  zEntry, int init
14b40 53 69 7a 65 29 7b 0a 20 20 63 68 61 72 20 2a 70  Size){.  char *p
14b50 3b 0a 20 20 69 6e 74 20 2a 61 6e 20 3d 20 28 69  ;.  int *an = (i
14b60 6e 74 2a 29 26 70 70 41 72 72 61 79 5b 31 5d 3b  nt*)&ppArray[1];
14b70 0a 20 20 69 66 28 20 61 6e 5b 30 5d 3e 3d 61 6e  .  if( an[0]>=an
14b80 5b 31 5d 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  [1] ){.    void 
14b90 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
14ba0 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53  ewSize;.    newS
14bb0 69 7a 65 20 3d 20 61 6e 5b 31 5d 2a 32 20 2b 20  ize = an[1]*2 + 
14bc0 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e  initSize;.    pN
14bd0 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
14be0 6f 63 28 2a 70 70 41 72 72 61 79 2c 20 6e 65 77  oc(*ppArray, new
14bf0 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  Size*szEntry);. 
14c00 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
14c10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
14c20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 5b  1;.    }.    an[
14c30 31 5d 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20  1] = newSize;.  
14c40 20 20 2a 70 70 41 72 72 61 79 20 3d 20 70 4e 65    *ppArray = pNe
14c50 77 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 2a 70 70  w;.  }.  p = *pp
14c60 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
14c70 26 70 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74 72 79  &p[an[0]*szEntry
14c80 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
14c90 20 20 72 65 74 75 72 6e 20 61 6e 5b 30 5d 2b 2b    return an[0]++
14ca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
14cb0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
14cc0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
14cd0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
14ce0 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
14cf0 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
14d00 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
14d10 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
14d20 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
14d30 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
14d40 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
14d50 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
14d60 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
14d70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
14d80 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
14d90 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
14da0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
14db0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
14dc0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
14dd0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
14de0 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
14df0 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72  .  i = sqlite3Ar
14e00 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69  rayAllocate((voi
14e10 64 2a 2a 29 26 70 4c 69 73 74 2d 3e 61 2c 20 73  d**)&pList->a, s
14e20 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
14e30 5d 29 2c 20 35 29 3b 0a 20 20 69 66 28 20 69 3c  ]), 5);.  if( i<
14e40 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
14e50 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
14e60 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
14e70 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
14e80 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
14e90 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
14ea0 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74  n(pToken);.  ret
14eb0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
14ec0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
14ed0 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
14ee0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
14ef0 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
14f00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
14f10 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
14f20 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
14f30 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
14f40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
14f50 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
14f60 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
14f70 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
14f80 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
14f90 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
14fa0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
14fb0 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
14fc0 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
14fd0 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
14fe0 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
14ff0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15000 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
15010 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
15020 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
15030 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
15040 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
15050 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
15060 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
15070 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
15080 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
15090 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
150a0 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
150b0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
150c0 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   -1;.}../*.** Ap
150d0 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
150e0 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
150f0 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
15100 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
15110 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
15120 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
15130 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
15140 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
15150 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
15160 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
15170 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
15180 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
15190 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
151a0 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
151b0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
151c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
151d0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
151e0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
151f0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
15200 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
15210 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
15220 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
15230 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
15240 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
15250 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
15260 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
15270 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
15280 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
15290 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
152a0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
152b0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
152c0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
152d0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
152e0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
152f0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
15300 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
15310 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
15320 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
15330 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
15340 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
15350 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
15360 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
15370 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
15380 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
15390 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
153a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
153b0 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
153c0 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
153d0 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
153e0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
153f0 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
15400 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
15410 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
15420 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
15430 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
15440 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
15450 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
15460 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
15470 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
15480 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
15490 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
154a0 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
154b0 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
154c0 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
154d0 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75 63  tabase){.  struc
154e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
154f0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
15500 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
15510 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
15520 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  c( sizeof(SrcLis
15530 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
15540 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
15550 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
15560 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
15570 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e  if( pList->nSrc>
15580 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
15590 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
155a0 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  New;.    pList->
155b0 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20  nAlloc *= 2;.   
155c0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   pNew = sqliteRe
155d0 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20  alloc(pList,.   
155e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
155f0 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c  of(*pList) + (pL
15600 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ist->nAlloc-1)*s
15610 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
15620 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
15630 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
15640 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
15650 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
15660 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15670 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
15680 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
15690 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
156a0 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73  t->nSrc];.  mems
156b0 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
156c0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
156d0 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  );.  if( pDataba
156e0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
156f0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
15700 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
15710 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
15720 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  && pTable ){.   
15730 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
15740 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
15750 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
15760 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
15770 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
15780 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
15790 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
157a0 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65  (pTable);.  pIte
157b0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
157c0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
157d0 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b 0a  ken(pDatabase);.
157e0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
157f0 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e   = -1;.  pList->
15800 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
15810 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
15820 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20   Assign cursors 
15830 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
15840 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
15850 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
15860 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
15870 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
15880 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
15890 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
158a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
158b0 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
158c0 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65 33 54  List || sqlite3T
158d0 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
158e0 65 64 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ed);.  if( pList
158f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
15900 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
15910 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
15920 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
15930 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
15940 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
15950 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
15960 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
15970 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
15980 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
15990 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
159a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
159b0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
159c0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
159d0 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
159e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
159f0 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
15a00 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
15a10 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
15a20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
15a30 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
15a40 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64  qlite3SrcListAdd
15a50 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70  Alias(SrcList *p
15a60 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
15a70 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
15a80 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63  t && pList->nSrc
15a90 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  >0 ){.    pList-
15aa0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
15ab0 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ].zAlias = sqlit
15ac0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
15ad0 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  pToken);.  }.}..
15ae0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
15af0 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
15b00 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
15b10 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
15b20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
15b30 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c  cListDelete(SrcL
15b40 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
15b50 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
15b60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
15b70 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
15b80 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
15b90 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
15ba0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
15bb0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
15bc0 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
15bd0 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74  Free(pItem->zDat
15be0 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
15bf0 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e  teFree(pItem->zN
15c00 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
15c10 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69  Free(pItem->zAli
15c20 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  as);.    sqlite3
15c30 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
15c40 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
15c50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15c60 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c  lete(pItem->pSel
15c70 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
15c80 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65  3ExprDelete(pIte
15c90 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
15ca0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
15cb0 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  (pItem->pUsing);
15cc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
15cd0 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
15ce0 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
15cf0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
15d00 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
15d10 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
15d20 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
15d30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15d40 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
15d50 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73   i;..  if( pPars
15d60 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
15d70 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
15d80 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
15d90 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15da0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
15db0 73 71 6c 69 74 65 33 54 73 64 28 29 2d 3e 6d 61  sqlite3Tsd()->ma
15dc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
15dd0 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
15de0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15df0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
15e00 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
15e10 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
15e20 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
15e30 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15e40 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
15e50 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
15e60 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
15e70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
15e80 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
15e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15ea0 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
15eb0 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
15ec0 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
15ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
15ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15ef0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
15f00 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
15f10 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
15f20 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
15f30 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
15f40 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
15f50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
15f60 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
15f70 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
15f80 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
15f90 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
15fa0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
15fb0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
15fc0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
15fd0 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
15fe0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
15ff0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
16000 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16010 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
16020 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
16030 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
16040 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
16050 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16060 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
16070 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16080 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
16090 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 0);.  }.}../*
160a0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74  .** Rollback a t
160b0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
160c0 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
160d0 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
160e0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
160f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
16100 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
16110 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
16120 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
16130 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
16140 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16150 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
16160 20 7c 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29   || sqlite3Tsd()
16170 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
16180 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
16190 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
161a0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
161b0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
161c0 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
161d0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
161e0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
161f0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
16200 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16210 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
16220 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
16230 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
16240 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
16250 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
16260 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
16270 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
16280 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
16290 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
162a0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
162b0 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
162c0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
162d0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
162e0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
162f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
16300 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
16310 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16320 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
16330 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
16340 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
16350 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
16360 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62  3BtreeFactory(db
16370 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45  , 0, 0, MAX_PAGE
16380 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  S, &db->aDb[1].p
16390 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Bt);.    if( rc!
163a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
163b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
163c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
163d0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
163e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
163f0 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
16400 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
16410 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
16420 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
16430 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
16440 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 2f 2a  turn 1;.    }./*
16450 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
16460 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
16470 33 53 63 68 65 6d 61 47 65 74 28 64 62 2d 3e 61  3SchemaGet(db->a
16480 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
16490 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e  if( !db->aDb[1].
164a0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
164b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
164c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2a 2f 0a 20  OMEM;.    }.*/. 
164d0 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
164e0 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   & !db->autoComm
164f0 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  it ){.      rc =
16500 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
16510 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  inTrans(db->aDb[
16520 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  1].pBt, 1);.    
16530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
16550 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16560 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
16570 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
16580 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
16590 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
165a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
165b0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
165c0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
165d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
165e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
165f0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
16600 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
16610 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
16620 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
16630 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
16640 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
16650 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
16660 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
16670 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
16680 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
16690 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
166a0 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
166b0 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
166c0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
166d0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
166e0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
166f0 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
16700 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
16710 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
16720 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
16730 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
16740 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
16750 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
16760 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
16770 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
16780 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
16790 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
167a0 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
167b0 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
167c0 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
167d0 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
167e0 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
167f0 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
16800 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
16810 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
16820 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
16830 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
16840 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
16850 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
16860 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
16870 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
16880 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
16890 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
168a0 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
168b0 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
168c0 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
168d0 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
168e0 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
168f0 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
16900 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
16910 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
16920 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
16930 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
16940 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
16950 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
16960 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
16970 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
16980 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
16990 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
169a0 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
169b0 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
169c0 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
169d0 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
169e0 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
169f0 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
16a00 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
16a10 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
16a20 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
16a30 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
16a40 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
16a50 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
16a60 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
16a70 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
16a80 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
16a90 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
16aa0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16ab0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
16ac0 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71   mask;..  v = sq
16ad0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16ae0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
16af0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
16b00 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
16b10 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20   if there was a 
16b20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20  prior error */. 
16b30 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
16b40 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
16b50 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b  cookieGoto==0 ){
16b60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  .    pParse->coo
16b70 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  kieGoto = sqlite
16b80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16b90 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a  _Goto, 0, 0)+1;.
16ba0 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30    }.  if( iDb>=0
16bb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16bc0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
16bd0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
16be0 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
16bf0 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  | iDb==1 );.    
16c00 61 73 73 65 72 74 28 20 69 44 62 3c 33 32 20 29  assert( iDb<32 )
16c10 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c  ;.    mask = 1<<
16c20 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50  iDb;.    if( (pP
16c30 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
16c40 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
16c50 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f       pParse->coo
16c60 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  kieMask |= mask;
16c70 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
16c80 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20  ookieValue[iDb] 
16c90 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
16ca0 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
16cb0 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28  ookie;.      if(
16cc0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
16cd0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
16ce0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
16cf0 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73  mpDatabase(pPars
16d00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16d10 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
16d20 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
16d30 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
16d40 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
16d50 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
16d60 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
16d70 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
16d80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
16d90 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
16da0 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
16db0 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
16dc0 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
16dd0 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
16de0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
16df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
16e00 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
16e10 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
16e20 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
16e30 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
16e40 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
16e50 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
16e60 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
16e70 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
16e80 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
16e90 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
16ea0 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
16eb0 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
16ec0 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
16ed0 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
16ee0 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
16ef0 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
16f00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
16f10 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
16f20 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
16f30 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
16f40 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
16f50 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
16f60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16f70 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
16f80 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
16f90 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
16fa0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
16fb0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
16fc0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61  .**.** Only data
16fd0 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65  base iDb and the
16fe0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
16ff0 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
17000 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a   by this call..*
17010 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65  * If iDb==0, the
17020 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74  n the main and t
17030 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72  emp databases ar
17040 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
17050 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20     If.** iDb==1 
17060 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65  then only the te
17070 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  mp database is m
17080 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49  ade writable.  I
17090 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65  f iDb>1 then the
170a0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75  .** specified au
170b0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
170c0 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
170d0 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
170e0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  writable..*/.voi
170f0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
17100 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
17110 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
17120 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
17130 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
17140 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
17150 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
17160 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
17170 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
17180 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
17190 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73  e, iDb);.  pPars
171a0 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  e->writeMask |= 
171b0 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65  1<<iDb;.  if( se
171c0 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50  tStatement && pP
171d0 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
171e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
171f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
17200 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29  atement, iDb, 0)
17210 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49  ;.  }.  if( (OMI
17220 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21  T_TEMPDB || iDb!
17230 3d 31 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64  =1) && pParse->d
17240 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30  b->aDb[1].pBt!=0
17250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
17260 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
17270 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74  on(pParse, setSt
17280 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d  atement, 1);.  }
17290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
172a0 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
172b0 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
172c0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
172d0 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
172e0 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
172f0 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
17300 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
17310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17320 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
17330 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
17340 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  h(CollSeq *pColl
17350 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
17360 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64  {.  int n = pInd
17370 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65  ex->keyInfo.nFie
17380 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  ld;.  CollSeq **
17390 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79  pp = pIndex->key
173a0 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68  Info.aColl;.  wh
173b0 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20  ile( n-- ){.    
173c0 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29  if( *pp==pColl )
173d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 70   return 1;.    p
173e0 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p++;.  }.  retur
173f0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
17400 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
17410 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
17420 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
17430 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17440 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
17450 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
17460 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
17470 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
17480 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17490 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
174a0 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
174b0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
174c0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
174d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
174e0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
174f0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
17500 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
17510 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
17520 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
17530 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
17540 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
17550 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
17560 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
17570 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
17580 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20  h(pColl,pIndex) 
17590 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
175a0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
175b0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
175c0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
175d0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
175e0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
175f0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
17600 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
17610 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
17620 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
17630 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
17640 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
17650 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
17660 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
17670 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
17680 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
17690 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
176a0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
176b0 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
176c0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
176d0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
176e0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
176f0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
17700 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
17710 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
17720 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
17730 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
17740 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44  Seq *pColl){.  D
17750 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
17760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
17770 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
17780 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
177b0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
177c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
177d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
177e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
177f0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
17800 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
17810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
17820 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
17830 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
17840 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17860 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
17870 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
17880 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
17890 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
178a0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
178b0 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d  ){.    if( pDb==
178c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
178d0 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
178e0 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
178f0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
17900 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
17910 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
17920 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
17930 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
17940 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
17950 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
17960 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, pColl);.    
17970 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
17980 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17990 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
179a0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
179b0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
179c0 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
179e0 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
179f0 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
17a10 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
17a20 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
17a30 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
17a40 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
17a50 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
17a60 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
17a70 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
17a80 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
17a90 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
17aa0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
17ab0 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
17ac0 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
17ad0 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
17ae0 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
17af0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
17b00 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
17b10 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
17b20 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
17b30 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
17b40 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
17b50 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
17b60 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
17b70 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
17b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
17b90 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
17ba0 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
17bb0 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
17bc0 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
17bd0 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
17be0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
17bf0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
17c00 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
17c10 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
17c20 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
17c50 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
17c60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
17c70 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
17c80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
17c90 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
17ca0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
17cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
17cc0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
17cd0 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
17ce0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
17cf0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
17d00 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
17d10 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
17d20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
17d30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
17d40 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
17d50 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
17d60 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17d70 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
17d80 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17d90 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
17da0 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
17db0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
17dc0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
17dd0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
17de0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
17df0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
17e00 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
17e10 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
17e20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
17e30 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
17e40 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
17e50 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
17e60 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
17e70 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
17e80 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
17e90 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
17ea0 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d  Name1==0 || pNam
17eb0 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e1->z==0 ){.    
17ec0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
17ed0 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
17ee0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
17ef0 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c   if( pName2==0 |
17f00 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
17f10 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
17f20 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
17f30 28 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 28 63  (db, db->enc, (c
17f40 68 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20  har*)pName1->z, 
17f50 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20  pName1->n, 0);. 
17f60 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
17f70 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
17f80 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 70  abases(pParse, p
17f90 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
17fa0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
17fb0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
17fc0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
17fd0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
17fe0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
17ff0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
18000 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
18010 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
18020 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20  ObjName);.  zDb 
18030 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
18040 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
18050 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
18060 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
18070 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
18080 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
18090 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
180a0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
180b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
180c0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
180d0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
180e0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
180f0 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28  teFree(z);.  if(
18100 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
18110 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
18120 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
18130 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
18140 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
18150 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
18160 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
18170 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
18180 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18190 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
181a0 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
181b0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
181c0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a              );.}.#endif.