/ Hex Artifact Content
Login

Artifact fcb437bcda09a57b3fe898dff5ff558e7536621b:


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 30 38 20 32 30 30 35 2f 30 32 2f 30 31  1.308 2005/02/01
02f0: 20 30 33 3a 34 36 3a 34 34 20 64 61 6e 69 65 6c   03:46:44 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 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
05f0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
0600: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0610: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  sted ) return;. 
0620: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 56   if( !pParse->pV
0630: 64 62 65 20 29 7b 0a 20 20 20 20 70 50 61 72 73  dbe ){.    pPars
0640: 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d 3e  e->rc = pParse->
0650: 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45 52  nErr ? SQLITE_ER
0660: 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e  ROR : SQLITE_DON
0670: 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  E;.    return;. 
0680: 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62   }..  /* Begin b
0690: 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d  y generating som
06a0: 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  e termination co
06b0: 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  de at the end of
06c0: 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70   the.  ** vdbe p
06d0: 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64 62  rogram.  */.  db
06e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
06f0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
0700: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
0710: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
0720: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
0730: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
0740: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b  .    /* The cook
0750: 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73  ie mask contains
0760: 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   one bit for eac
0770: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
0780: 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69  open..    ** (Bi
0790: 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c  t 0 is for main,
07a0: 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65   bit 1 is for te
07b0: 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  mp, and so forth
07c0: 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20  .)  Bits are.   
07d0: 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68   ** set for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
07f0: 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74  s used.  Generat
0800: 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20  e code to start 
0810: 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  a.    ** transac
0820: 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65  tion on each use
0830: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  d database and t
0840: 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  o verify the sch
0850: 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a  ema cookie.    *
0860: 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64  * on each used d
0870: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
0880: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
0890: 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a  cookieGoto>0 ){.
08a0: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a        u32 mask;.
08b0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
08c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
08d0: 43 68 61 6e 67 65 50 32 28 76 2c 20 70 50 61 72  ChangeP2(v, pPar
08e0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31  se->cookieGoto-1
08f0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
0900: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
0910: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d      for(iDb=0, m
0920: 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e  ask=1; iDb<db->n
0930: 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44  Db; mask<<=1, iD
0940: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
0950: 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  ( (mask & pParse
0960: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30  ->cookieMask)==0
0970: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
0980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0990: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
09a0: 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d  saction, iDb, (m
09b0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72  ask & pParse->wr
09c0: 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20  iteMask)!=0);.  
09d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
09e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72  eAddOp(v, OP_Ver
09f0: 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  ifyCookie, iDb, 
0a00: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
0a10: 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20  lue[iDb]);.     
0a20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
0a30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0a40: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
0a50: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20  >cookieGoto);.  
0a60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
0a70: 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e  a No-op that con
0a80: 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65  tains the comple
0a90: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
0aa0: 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20  ompiled SQL.    
0ab0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  ** statement as 
0ac0: 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e  its P3 argument.
0ad0: 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20    This does not 
0ae0: 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74  change the funct
0af0: 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20  ionality.    ** 
0b00: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
0b10: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
0b20: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 69  his is used to i
0b30: 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
0b40: 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f  _trace()..    */
0b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0b60: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  Op3(v, OP_Noop, 
0b70: 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53  0, 0, pParse->zS
0b80: 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69  ql, pParse->zTai
0b90: 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b  l-pParse->zSql);
0ba0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
0bb0: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
0bc0: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
0bd0: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
0be0: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
0bf0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  r==0 ){.    FILE
0c00: 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66   *trace = (db->f
0c10: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
0c20: 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74  beTrace)!=0 ? st
0c30: 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71  dout : 0;.    sq
0c40: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76  lite3VdbeTrace(v
0c50: 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71  , trace);.    sq
0c60: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
0c70: 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56  dy(v, pParse->nV
0c80: 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ar, pParse->nMem
0c90: 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +3,.            
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
0cb0: 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61  rse->nTab+3, pPa
0cc0: 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68 2b 31  rse->nMaxDepth+1
0cd0: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
0ce0: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
0cf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
0d00: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  ;.    pParse->co
0d10: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20  lNamesSet = 0;. 
0d20: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73   }else if( pPars
0d30: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
0d40: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
0d50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
0d60: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
0d70: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
0d80: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
0d90: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
0da0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
0db0: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
0dc0: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
0dd0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
0de0: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
0df0: 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73  .** Run the pars
0e00: 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  er and code gene
0e10: 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c  rator recursivel
0e20: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  y in order to ge
0e30: 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66  nerate.** code f
0e40: 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  or the SQL state
0e50: 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20  ment given onto 
0e60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
0e70: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a  Parse context.**
0e80: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
0e90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
0ea0: 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20  When the parser 
0eb0: 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65  is run recursive
0ec0: 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20  ly.** this way, 
0ed0: 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c  the final OP_Hal
0ee0: 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65  t is not appende
0ef0: 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74  d and other init
0f00: 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  ialization.** an
0f10: 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73  d finalization s
0f20: 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64  teps are omitted
0f30: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61   because those a
0f40: 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74  re handling by t
0f50: 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20  he.** outermost 
0f60: 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  parser..**.** No
0f70: 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  t everything is 
0f80: 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20  nestable.  This 
0f90: 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69  facility is desi
0fa0: 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a  gned to permit.*
0fb0: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
0fc0: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65  , and DELETE ope
0fd0: 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20  rations against 
0fe0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20  SQLITE_MASTER.  
0ff0: 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79  Use.** care if y
1000: 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79  ou decide to try
1010: 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75   to use this rou
1020: 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  tine for some ot
1030: 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f  her purposes..*/
1040: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73  .void sqlite3Nes
1050: 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a  tedParse(Parse *
1060: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1070: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1080: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1090: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
10a0: 20 69 6e 74 20 72 63 3b 0a 23 20 64 65 66 69 6e   int rc;.# defin
10b0: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
10c0: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
10d0: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
10e0: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
10f0: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
1100: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1110: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
1120: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
1130: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
1140: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
1150: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1160: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1170: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1180: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1190: 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  VMPrintf(zFormat
11a0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
11b0: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
11c0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
11d0: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
11e0: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
11f0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1200: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1210: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1220: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1230: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1240: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1250: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 72 63  , SAVE_SZ);.  rc
1260: 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72   = sqlite3RunPar
1270: 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c  ser(pParse, zSql
1280: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  , 0);.  sqliteFr
1290: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63  ee(zSql);.  memc
12a0: 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  py(&pParse->nVar
12b0: 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f  , saveBuf, SAVE_
12c0: 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  SZ);.  pParse->n
12d0: 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a  ested--;.}../*.*
12e0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
12f0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1300: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1310: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1320: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
1330: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1340: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
1350: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
1360: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
1370: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1380: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
1390: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
13a0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
13b0: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
13c0: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
13d0: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
13e0: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
13f0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74  the.** first mat
1400: 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72  ching table is r
1410: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
1420: 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69  ecking for dupli
1430: 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  cate table.** na
1440: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
1450: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
1460: 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  is TEMP first, t
1470: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
1480: 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  ny.** auxiliary 
1490: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20  databases added 
14a0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
14b0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
14c0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
14d0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
14e0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
14f0: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
1500: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1510: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1520: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29  char *zDatabase)
1530: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30  {.  Table *p = 0
1540: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
1550: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
1560: 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e  .  assert( (db->
1570: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1580: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64  nitialized) || d
1590: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
15a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
15b0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
15c0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
15d0: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
15e0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
15f0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
1600: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
1610: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1620: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
1630: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1640: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1650: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1660: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
1670: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1680: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1690: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
16a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
16b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
16c0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
16d0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
16e0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
16f0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
1700: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
1710: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
1720: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
1730: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
1740: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
1750: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1760: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1770: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1780: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
1790: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
17a0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
17b0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
17c0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
17d0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
17e0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
17f0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
1800: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
1810: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
1820: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
1830: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
1840: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
1850: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
1860: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
1870: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61  e3LocateTable(Pa
1880: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1890: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
18a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
18b0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  se){.  Table *p;
18c0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
18d0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
18e0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
18f0: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1900: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1910: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1920: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1930: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1940: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1950: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1960: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1970: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
1980: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1990: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
19a0: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66  e, zDbase);.  if
19b0: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ( p==0 ){.    if
19c0: 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20  ( zDbase ){.    
19d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19e0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
19f0: 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22  ch table: %s.%s"
1a00: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
1a10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a20: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1a30: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1a40: 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
1a50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a60: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
1a70: 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20  e \"%s\" is not 
1a80: 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73  in database \"%s
1a90: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e  \"",.         zN
1aa0: 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20  ame, zDbase);.  
1ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ac0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ad0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1ae0: 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  table: %s", zNam
1af0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1b00: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1b10: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 1;.  }.  ret
1b20: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1b30: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1b40: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1b50: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
1b60: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
1b70: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
1b80: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
1b90: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
1ba0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1bb0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1bc0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
1bd0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1be0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1bf0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1c00: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1c10: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1c20: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
1c30: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
1c40: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
1c50: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
1c60: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
1c70: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
1c80: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
1c90: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
1ca0: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
1cb0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
1cc0: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
1cd0: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
1ce0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
1cf0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
1d00: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
1d10: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
1d20: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1d30: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1d40: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
1d50: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
1d60: 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e  .  assert( (db->
1d70: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1d80: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64  nitialized) || d
1d90: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
1da0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1db0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1dc0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
1dd0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
1de0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1df0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
1e00: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
1e10: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
1e20: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1e30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1e40: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1e50: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78  (&db->aDb[j].idx
1e60: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1e70: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1e80: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1e90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
1eb0: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
1ec0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
1ed0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
1ee0: 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  eeIndex(Index *p
1ef0: 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
1f00: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  p->zColAff);.  s
1f10: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
1f20: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
1f30: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
1f40: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
1f50: 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65  h table, and fre
1f60: 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20  e.** its memory 
1f70: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
1f80: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72  * The index is r
1f90: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1fa0: 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61  database hash ta
1fb0: 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69  bles but.** it i
1fc0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66  s not unlinked f
1fd0: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68  rom the Table th
1fe0: 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a  at it indexes..*
1ff0: 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d  * Unlinking from
2000: 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20   the Table must 
2010: 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  be done by the c
2020: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
2030: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2040: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
2050: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
2060: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65  ndex *p){.  Inde
2070: 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65  x *pOld;..  asse
2080: 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d 3e  rt( db!=0 && p->
2090: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f  zName!=0 );.  pO
20a0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
20b0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
20c0: 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  p->iDb].idxHash,
20d0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a       strlen(p->z
2100: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69  Name)+1, 0);.  i
2110: 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f  f( pOld!=0 && pO
2120: 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c  ld!=p ){.    sql
2130: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
2140: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
2150: 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a  idxHash, pOld->z
2160: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
2170: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
2180: 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31  n(pOld->zName)+1
2190: 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 66  , pOld);.  }.  f
21a0: 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a  reeIndex(p);.}..
21b0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
21c0: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
21d0: 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65  m its table, the
21e0: 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20  n remove.** the 
21f0: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
2200: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
2210: 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d  and free its mem
2220: 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ory.** structure
2230: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2240: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
2250: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
2260: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
2270: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
2280: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
2290: 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  dex;.  int len;.
22a0: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
22b0: 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  zIdxName);.  pIn
22c0: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73  dex = sqlite3Has
22d0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
22e0: 5b 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 7a  [iDb].idxHash, z
22f0: 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20  IdxName, len+1, 
2300: 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  0);.  if( pIndex
2310: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
2320: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
2330: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
2340: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
2350: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
2360: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
2380: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  ex *p;.      for
2390: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
23a0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
23b0: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
23c0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
23d0: 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70        if( p && p
23e0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20  ->pNext==pIndex 
23f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
2400: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
2410: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2420: 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78   }.    freeIndex
2430: 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20  (pIndex);.  }.  
2440: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
2450: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2460: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  s;.}../*.** Eras
2470: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
2480: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2490: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
24a0: 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20   tables of.** a 
24b0: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e  single database.
24c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
24d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c  s called to recl
24e0: 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65  aim memory.** be
24f0: 66 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  fore the databas
2500: 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73  e closes.  It is
2510: 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72   also called dur
2520: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ing a rollback.*
2530: 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  * if there were 
2540: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
2550: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
2560: 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a  ction or if a.**
2570: 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d   schema-cookie m
2580: 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a  ismatch occurs..
2590: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20  **.** If iDb<=0 
25a0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
25b0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74  nternal schema t
25c0: 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61  ables for all da
25d0: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e  tabase.** files.
25e0: 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e    If iDb>=2 then
25f0: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
2600: 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f  nal schema for o
2610: 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c  nly the.** singl
2620: 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64  e file indicated
2630: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2640: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
2650: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
2660: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61  , int iDb){.  Ha
2670: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
2680: 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48   Hash temp1;.  H
2690: 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74  ash temp2;.  int
26a0: 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74   i, j;..  assert
26b0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
26c0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d  db->nDb );.  db-
26d0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
26e0: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20  E_Initialized;. 
26f0: 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62   for(i=iDb; i<db
2700: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2710: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2720: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70  aDb[i];.    temp
2730: 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68  1 = pDb->tblHash
2740: 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44  ;.    temp2 = pD
2750: 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  b->trigHash;.   
2760: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
2770: 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c  (&pDb->trigHash,
2780: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
2790: 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ING, 0);.    sql
27a0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70  ite3HashClear(&p
27b0: 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20  Db->aFKey);.    
27c0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
27d0: 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b  (&pDb->idxHash);
27e0: 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  .    for(pElem=s
27f0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2800: 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70  temp2); pElem; p
2810: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
2820: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
2830: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
2840: 54 72 69 67 67 65 72 28 28 54 72 69 67 67 65 72  Trigger((Trigger
2850: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
2860: 28 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a  (pElem));.    }.
2870: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
2880: 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20  lear(&temp2);.  
2890: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
28a0: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
28b0: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
28c0: 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  ING, 0);.    for
28d0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
28e0: 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20  hFirst(&temp1); 
28f0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2900: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2910: 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  m)){.      Table
2920: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
2930: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
2950: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
2960: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
2970: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2980: 74 65 6d 70 31 29 3b 0a 20 20 20 20 70 44 62 2d  temp1);.    pDb-
2990: 3e 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20 20  >pSeqTab = 0;.  
29a0: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
29b0: 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65  y(db, i, DB_Sche
29c0: 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69  maLoaded);.    i
29d0: 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72  f( iDb>0 ) retur
29e0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
29f0: 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d   iDb==0 );.  db-
2a00: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
2a10: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2a20: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
2a30: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
2a40: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
2a50: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
2a60: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
2a70: 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f   remove then fro
2a80: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
2a90: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
2aa0: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
2ab0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2ac0: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
2ad0: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
2ae0: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
2af0: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
2b00: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
2b10: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
2b20: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
2b30: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
2b40: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
2b50: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
2b60: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
2b70: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2b80: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
2b90: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2ba0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
2bb0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
2bc0: 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65  Aux && pDb->xFre
2bd0: 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65  eAux ) pDb->xFre
2be0: 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b  eAux(pDb->pAux);
2bf0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78  .      pDb->pAux
2c00: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2c10: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
2c20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2c30: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
2c40: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
2c50: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
2c60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2c70: 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61  iteFree(pDb->zNa
2c80: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
2c90: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2cb0: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
2cc0: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
2cd0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
2ce0: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
2cf0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
2d00: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
2d10: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
2d20: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
2d30: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
2d40: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
2d50: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
2d60: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
2d70: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
2d80: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
2d90: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
2da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2db0: 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  e(db->aDb);.    
2dc0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
2dd0: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
2de0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2df0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2e00: 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
2e10: 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65   occurs.  If the
2e20: 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d  re were.** schem
2e30: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
2e40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2e50: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
2e60: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69  o reset the.** i
2e70: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
2e80: 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74  les and reload t
2e90: 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  hem from disk..*
2ea0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
2eb0: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
2ec0: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
2ed0: 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  b){.  if( db->fl
2ee0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
2ef0: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
2f00: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
2f10: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
2f20: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
2f30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2f40: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
2f50: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
2f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
2f70: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
2f80: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
2f90: 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  {.  db->flags &=
2fa0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
2fb0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2fc0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
2fd0: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74  n names from a t
2fe0: 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f  able or view..*/
2ff0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3000: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
3010: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
3020: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
3030: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61  olumn *pCol;.  a
3040: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
3050: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
3060: 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  Col=pTable->aCol
3070: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3080: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3090: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
30a0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
30b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
30c0: 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  te(pCol->pDflt);
30d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
30e0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20  pCol->zType);.  
30f0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
3100: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
3110: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
3120: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
3130: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
3140: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
3150: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
3160: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3170: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
3180: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
3190: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
31a0: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
31b0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
31c0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
31d0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
31e0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
31f0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
3200: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
3210: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
3220: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72  hash table.  Nor
3230: 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a   does it remove.
3240: 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ** foreign keys 
3250: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e  from the sqlite.
3260: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3270: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
3280: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
3290: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
32a0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
32b0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
32c0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
32d0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
32e0: 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   Indices associa
32f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
3300: 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20  le are unlinked 
3310: 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a  from the "db".**
3320: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
3330: 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66  if db!=NULL.  If
3340: 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63   db==NULL, indic
3350: 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a  es attached to.*
3360: 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  * the table are 
3370: 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20  deleted, but it 
3380: 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20  is assumed they 
3390: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
33a0: 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  n.** unlinked..*
33b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
33c0: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
33d0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
33e0: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
33f0: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
3400: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
3410: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
3420: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
3430: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  turn;..  /* Dele
3440: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3450: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3460: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
3470: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
3480: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
3490: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
34a0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
34b0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
34c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
34d0: 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  ex->iDb==pTable-
34e0: 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d  >iDb || (pTable-
34f0: 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65  >iDb==0 && pInde
3500: 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20  x->iDb==1) );.  
3510: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
3520: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3530: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3540: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3550: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3560: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3570: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3580: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3590: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
35a0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
35b0: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
35c0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b  from the db->aFK
35d0: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
35e0: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
35f0: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
3600: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
3610: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
3620: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
3630: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
3640: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44  sert( pTable->iD
3650: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
3660: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3670: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
3680: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61  b[pTable->iDb].a
3690: 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  FKey,.          
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72   pFKey->zTo, str
36c0: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
36d0: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
36e0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
36f0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3700: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3710: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3720: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3730: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3740: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3750: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
3760: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
3770: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3780: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
3790: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
37a0: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
37b0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
37c0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
37d0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
37e0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
37f0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
3800: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
3810: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
3820: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
3830: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3840: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3850: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
3860: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3870: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3880: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
3890: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
38a0: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
38b0: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
38c0: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
38d0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
38e0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
38f0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
3900: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
3910: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
3920: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
3930: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
3940: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3950: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
3960: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3970: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29  (zTabName)+1, 0)
3980: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
3990: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
39a0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
39b0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
39c0: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
39d0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
39e0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
39f0: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
3a00: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
3a10: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
3a20: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  pDb->aFKey, pF1-
3a30: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3a40: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
3a50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3a60: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3a70: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3a80: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3a90: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
3aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
3ab0: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3ac0: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3ad0: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3ae0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3af0: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
3b00: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
3b10: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
3b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3b30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3b40: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3b50: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20  le(db, p);.  }. 
3b60: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
3b70: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3b80: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
3b90: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
3ba0: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
3bb0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
3bc0: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
3bd0: 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20   token with any 
3be0: 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76  quotations remov
3bf0: 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ed.  Space to ho
3c00: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
3c10: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
3c20: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3c30: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
3c40: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
3c50: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
3c60: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nction..**.** To
3c70: 6b 65 6e 73 20 61 72 65 20 72 65 61 6c 6c 79 20  kens are really 
3c80: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
3c90: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
3ca0: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
3cb0: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
3cc0: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
3cd0: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
3ce0: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
3cf0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
3d00: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3d10: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
3d20: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
3d30: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  3NameFromToken(T
3d40: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
3d60: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
3d70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
3d80: 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  rNDup(pName->z, 
3d90: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
3da0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
3db0: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
3dc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
3dd0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
3de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
3df0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
3e00: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
3e10: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
3e20: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
3e30: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
3e40: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
3e50: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
3e60: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
3e70: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
3e80: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
3e90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3ea0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
3eb0: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
3ec0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3ed0: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
3ee0: 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71  STER_ROOT);.  sq
3ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3f00: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
3f10: 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71  ns, 0, 5); /* sq
3f20: 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20  lite_master has 
3f30: 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a  5 columns */.}..
3f40: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
3f50: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
3f60: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
3f70: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
3f80: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
3f90: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
3fa0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
3fb0: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
3fc0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
3fd0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
3fe0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
3ff0: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
4000: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
4010: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
4020: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
4030: 20 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20   findDb(sqlite3 
4040: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
4050: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4060: 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  ;    /* Database
4070: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
4080: 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   n;         /* N
4090: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
40a0: 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  ers in the name 
40b0: 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  */.  Db *pDb;   
40c0: 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73      /* A databas
40d0: 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61  e whose name spa
40e0: 63 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  ce is being sear
40f0: 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ched */.  char *
4100: 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  zName;   /* Name
4110: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
4120: 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d  g for */..  zNam
4130: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
4140: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
4150: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
4160: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a      n = strlen(z
4170: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Name);.    for(i
4180: 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44  =(db->nDb-1), pD
4190: 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69  b=&db->aDb[i]; i
41a0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29  >=0; i--, pDb--)
41b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 73  {.      if( n==s
41c0: 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65  trlen(pDb->zName
41d0: 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  ) && 0==sqlite3S
41e0: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
41f0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
4200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4210: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4220: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4230: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
4240: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
4250: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
4260: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
4270: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
4280: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
4290: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
42a0: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
42b0: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
42c0: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
42d0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
42e0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
42f0: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
4300: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4310: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
4320: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
4330: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
4340: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
4350: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
4360: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
4370: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
4380: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
4390: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
43a0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
43b0: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
43c0: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
43d0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
43e0: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
43f0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
4400: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
4410: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
4420: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
4430: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
4440: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
4450: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
4460: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
4470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
4480: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
4490: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
44a0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
44b0: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
44c0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
44d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
44e0: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
44f0: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
4500: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
4510: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
4520: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
4530: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
4540: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4550: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
4560: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
4570: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
4580: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
4590: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
45a0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
45b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
45c0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
45d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
45e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
45f0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61  ->db;..  if( pNa
4600: 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
4610: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
4620: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
4630: 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c   );.    *pUnqual
4640: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
4650: 44 62 20 3d 20 66 69 6e 64 44 62 28 64 62 2c 20  Db = findDb(db, 
4660: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
4670: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
4680: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4690: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
46a0: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
46b0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
46c0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
46d0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
46e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
46f0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
4700: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
4710: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
4720: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
4730: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
4740: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
4750: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
4760: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4770: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
4780: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
4790: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
47a0: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
47b0: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
47c0: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
47d0: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
47e0: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
47f0: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
4800: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
4810: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
4820: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
4830: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
4840: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
4850: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
4860: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
4870: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
4880: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
4890: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
48a0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
48b0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
48c0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
48d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
48e0: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
48f0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
4900: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
4910: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
4920: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
4930: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
4940: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
4950: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4960: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
4970: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
4980: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
4990: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
49a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
49b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
49c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
49d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
49e0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
49f0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
4a00: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
4a10: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
4a20: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
4a30: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
4a40: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
4a50: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
4a60: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
4a70: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4a80: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
4a90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4aa0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
4ab0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
4ac0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
4ad0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
4ae0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
4af0: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
4b00: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
4b10: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
4b20: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
4b30: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
4b40: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
4b50: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
4b60: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
4b70: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
4b80: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
4b90: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
4ba0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
4bb0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
4bc0: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
4bd0: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
4be0: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
4bf0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
4c00: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
4c10: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
4c20: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
4c30: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
4c40: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
4c50: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
4c60: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
4c70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4c80: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
4c90: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
4ca0: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
4cb0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
4cc0: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
4cd0: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
4ce0: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
4cf0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
4d00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4d10: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
4d20: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
4d30: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
4d40: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
4d50: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
4d60: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
4d70: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
4d80: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
4d90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4da0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
4db0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4dc0: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
4dd0: 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e  e "CREATE" token
4de0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4df0: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
4e00: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
4e10: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
4e20: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
4e30: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
4e40: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
4e50: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
4e60: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
4e70: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
4e80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
4e90: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
4ea0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
4eb0: 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w       /* True 
4ec0: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
4ed0: 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  W */.){.  Table 
4ee0: 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78  *pTable;.  Index
4ef0: 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a   *pIdx;.  char *
4f00: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
4f10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
4f20: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
4f30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4f40: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
4f50: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
4f60: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4f70: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
4f80: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
4f90: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4fa0: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
4fb0: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
4fc0: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
4fd0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
4fe0: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
4ff0: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
5000: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5010: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
5020: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
5030: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5040: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5050: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5060: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
5070: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5080: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5090: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
50a0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
50b0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
50c0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
50d0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
50e0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
50f0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5100: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5110: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
5120: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5130: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
5140: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5150: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
5160: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
5170: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
5180: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
5190: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
51a0: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
51b0: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
51c0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
51d0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
51e0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
51f0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
5200: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
5210: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5220: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
5230: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5240: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
5250: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
5260: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
5270: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
5280: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
5290: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
52a0: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
52b0: 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26  ;.  if( isTemp &
52c0: 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f  & iDb>1 ){.    /
52d0: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
52e0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
52f0: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
5300: 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20  qualified */.   
5310: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5320: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
5330: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
5340: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
5350: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
5360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
5370: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
5380: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
5390: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
53a0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
53b0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
53c0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
53d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
53e0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
53f0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
5400: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
5410: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
5420: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5430: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
5440: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
5450: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
5460: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5470: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
5480: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
5490: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
54a0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
54b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
54c0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
54d0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
54e0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
54f0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
5500: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
5510: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
5520: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5530: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5540: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
5550: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
5560: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b     if( isTemp ){
5570: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5580: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5590: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
55a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
55b0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
55c0: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
55d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
55e0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
55f0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5600: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5610: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
5620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5630: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5640: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
5650: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5660: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5670: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
5680: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
5690: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
56a0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
56b0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
56c0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
56d0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
56e0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
56f0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
5700: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
5710: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
5720: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
5730: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
5740: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
5750: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   ** it does..  *
5760: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
5770: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
5780: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
5790: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
57a0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
57b0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
57c0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
57d0: 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  zName, db->aDb[i
57e0: 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  Db].zName);.  if
57f0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
5800: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5810: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
5820: 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  T already exists
5830: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 67  ", pName);.    g
5840: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5850: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
5860: 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33   (pIdx = sqlite3
5870: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
5880: 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 20 0a  ame, 0))!=0 && .
5890: 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30 20 7c        ( iDb==0 |
58a0: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
58b0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
58c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
58d0: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
58e0: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
58f0: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
5900: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5910: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5920: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
5930: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
5940: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
5950: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
5960: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
5970: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
5980: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5990: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
59a0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
59b0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
59c0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
59d0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->nCol = 0;.  pT
59e0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
59f0: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
5a00: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
5a10: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54  pIndex = 0;.  pT
5a20: 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b  able->iDb = iDb;
5a30: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
5a40: 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74  NewTable ) sqlit
5a50: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
5a60: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
5a70: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
5a80: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
5a90: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
5aa0: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
5ab0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
5ac0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
5ad0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
5ae0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
5af0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
5b00: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
5b10: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
5b20: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
5b30: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
5b40: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
5b50: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
5b60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
5b70: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
5b80: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
5b90: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
5ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  ==0 ){.    db->a
5bb0: 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20  Db[iDb].pSeqTab 
5bc0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
5bd0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
5be0: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
5bf0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
5c00: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
5c10: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
5c20: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
5c30: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
5c40: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
5c50: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
5c60: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
5c70: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
5c80: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5c90: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
5ca0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
5cb0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
5cc0: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
5cd0: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
5ce0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
5cf0: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
5d00: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
5d10: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
5d20: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
5d30: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
5d40: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
5d50: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
5d60: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
5d70: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
5d80: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
5d90: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
5da0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
5db0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
5dc0: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
5dd0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
5de0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
5df0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
5e00: 0a 20 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69  .    /* Every ti
5e10: 6d 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69  me a new table i
5e20: 73 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  s created the fi
5e30: 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  le-format.    **
5e40: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65   and encoding me
5e50: 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20 73 65  ta-values are se
5e60: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
5e70: 65 2c 20 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73  e, in.    ** cas
5e80: 65 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  e this is the fi
5e90: 72 73 74 20 74 61 62 6c 65 20 63 72 65 61 74 65  rst table create
5ea0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
5eb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5ec0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
5ed0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30  ->file_format, 0
5ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5ef0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
5f00: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29  tCookie, iDb, 1)
5f10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5f20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5f30: 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30  eger, db->enc, 0
5f40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5f50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
5f60: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29  tCookie, iDb, 4)
5f70: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
5f80: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
5f90: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
5fa0: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
5fb0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
5fc0: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
5fd0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
5fe0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
5ff0: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
6000: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
6010: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
6020: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
6030: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
6040: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
6050: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
6060: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
6070: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f   entry is left o
6080: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
6090: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54   stack..    ** T
60a0: 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69  he rowid value i
60b0: 73 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  s needed by the 
60c0: 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
60d0: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20  3EndTable will. 
60e0: 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a     ** generate..
60f0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
6100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
6110: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
6120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6130: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6140: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
6150: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
6160: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
6170: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6180: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
6190: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  iDb, 0);.    }. 
61a0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
61b0: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62  sterTable(v, iDb
61c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
61d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
61e0: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
61f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6200: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
6210: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6220: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6230: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
6240: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6250: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
6260: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
6270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6280: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
6290: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
62a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
62b0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
62c0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
62d0: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
62e0: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
62f0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
6300: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
6310: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
6320: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
6330: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
6340: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
6350: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
6360: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
6370: 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  are two strings 
6380: 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73  in a case-insens
6390: 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a  itive manner..**
63a0: 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20   It is slightly 
63b0: 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c  faster than call
63c0: 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43  ing sqlite3StrIC
63d0: 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62  mp() directly, b
63e0: 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c  ut.** produces l
63f0: 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  arger code..**.*
6400: 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20  * WARNING: This 
6410: 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d  macro is not com
6420: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
6430: 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79   strcmp() family
6440: 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  . It.** returns 
6450: 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20  true if the two 
6460: 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61  strings are equa
6470: 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c  l, otherwise fal
6480: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  se..*/.#define S
6490: 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a  TRICMP(x, y) (\.
64a0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
64b0: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
64c0: 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c  har *)(x)]==   \
64d0: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
64e0: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
64f0: 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20  char *)(y)]     
6500: 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  \.&& sqlite3StrI
6510: 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29  Cmp((x)+1,(y)+1)
6520: 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ==0 )../*.** Add
6530: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
6540: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
6550: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
6560: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
6570: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
6580: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
6590: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
65a0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
65b0: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
65c0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
65d0: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
65e0: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
65f0: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
6600: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
6610: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6620: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
6630: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
6640: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
6650: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
6660: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
6670: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
6680: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
6690: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
66a0: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
66b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
66c0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
66d0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
66e0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
66f0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
6700: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
6710: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
6720: 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43  ){.    if( STRIC
6730: 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  MP(z, p->aCol[i]
6740: 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
6750: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6760: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
6770: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
6780: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
6790: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
67a0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
67b0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
67c0: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
67d0: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
67e0: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
67f0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
6800: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
6810: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
6820: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
6830: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
6840: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
6850: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
6860: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
6870: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
6880: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
6890: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
68a0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
68b0: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
68c0: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
68d0: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
68e0: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
68f0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
6900: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
6910: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
6920: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
6930: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
6940: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
6950: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
6960: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
6970: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
6980: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6990: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
69a0: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
69b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
69c0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
69d0: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
69e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
69f0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
6a00: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
6a10: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
6a20: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
6a30: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6a40: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
6a50: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
6a60: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
6a70: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
6a80: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6a90: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6aa0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6ab0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6ac0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6ad0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
6ae0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
6af0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
6b00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6b10: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
6b20: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6b30: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6b40: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6b50: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
6b60: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
6b70: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
6b80: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
6b90: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
6ba0: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
6bb0: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
6bc0: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
6bd0: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
6be0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6bf0: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
6c00: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
6c10: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
6c20: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
6c30: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
6c40: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
6c50: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
6c60: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
6c70: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
6c80: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
6c90: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
6ca0: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
6cb0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
6cc0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
6cd0: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
6ce0: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
6cf0: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
6d00: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
6d10: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
6d20: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
6d30: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
6d40: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
6d50: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
6d60: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
6d70: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
6da0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
6db0: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
6dc0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
6dd0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
6de0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
6df0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
6e00: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
6e10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
6e20: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
6e30: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
6e40: 4f 4e 45 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  ONE.**.** If non
6e50: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
6e60: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
6e70: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
6e80: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
6e90: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
6ea0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ned..*/.static c
6eb0: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
6ec0: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
6ed0: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
6ee0: 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20 3d  Type){.  u32 h =
6ef0: 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d   0;.  char aff =
6f00: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
6f10: 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  RIC;.  const uns
6f20: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20  igned char *zIn 
6f30: 3d 20 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74  = zType;.  const
6f40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6f50: 7a 45 6e 64 20 3d 20 28 7a 49 6e 2b 6e 54 79 70  zEnd = (zIn+nTyp
6f60: 65 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49  e);..  while( zI
6f70: 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68  n!=zEnd ){.    h
6f80: 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69   = (h<<8) + sqli
6f90: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
6fa0: 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  *zIn];.    zIn++
6fb0: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
6fc0: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
6fd0: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
6fe0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
6ff0: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
7000: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7010: 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73  _TEXT; .    }els
7020: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
7030: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
7040: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
7050: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
7060: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7070: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
7080: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7090: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
70a0: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
70b0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
70c0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
70d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
70e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
70f0: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
7100: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
7110: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
7120: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
7130: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7140: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7150: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7160: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
7170: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
7180: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
7190: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
71a0: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
71b0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
71c0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
71d0: 45 52 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  ER; .      break
71e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
71f0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
7200: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7210: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7220: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7230: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7240: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7250: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7260: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
7270: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
7280: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
7290: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
72a0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
72b0: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
72c0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
72d0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
72e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
72f0: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
7300: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
7310: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
7320: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
7330: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
7340: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
7350: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
7360: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
7370: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
7380: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
7390: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
73a0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
73b0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
73c0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74  e, Token *pFirst
73d0: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b  , Token *pLast){
73e0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
73f0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
7400: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  ;.  char *z;.  c
7410: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7420: 61 72 20 2a 7a 49 6e 3b 0a 0a 20 20 43 6f 6c 75  ar *zIn;..  Colu
7430: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
7440: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7450: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7460: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
7470: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
7480: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
7490: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
74a0: 20 20 7a 49 6e 20 3d 20 70 46 69 72 73 74 2d 3e    zIn = pFirst->
74b0: 7a 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e  z;.  n = pLast->
74c0: 6e 20 2b 20 28 70 4c 61 73 74 2d 3e 7a 20 2d 20  n + (pLast->z - 
74d0: 7a 49 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  zIn);.  assert( 
74e0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
74f0: 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54  ;.  z = pCol->zT
7500: 79 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ype = sqliteMall
7510: 6f 63 52 61 77 28 6e 2b 31 29 3b 0a 20 20 69 66  ocRaw(n+1);.  if
7520: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
7530: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
7540: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
7550: 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20 20   c = zIn[i];.   
7560: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
7570: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7580: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  z[j++] = c;.  }.
7590: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43    z[j] = 0;.  pC
75a0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
75b0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
75c0: 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  pe(z, n);.}../*.
75d0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
75e0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
75f0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
7600: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
7610: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
7620: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
7630: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
7640: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
7650: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
7660: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
7670: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
7680: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
7690: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
76a0: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
76b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
76c0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
76d0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
76e0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
76f0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
7700: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7710: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7720: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
7730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7740: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54  xpr *pExpr){.  T
7750: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
7760: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
7770: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7780: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7790: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 28 70  rn;.  pCol = &(p
77a0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
77b0: 5d 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  ]);.  if( !sqlit
77c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
77d0: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
77e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
77f0: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
7800: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
7810: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
7820: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 70  tant",.        p
7830: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Col->zName);.  }
7840: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
7850: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
7860: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 70 43  ->pDflt);.    pC
7870: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69  ol->pDflt = sqli
7880: 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72  te3ExprDup(pExpr
7890: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
78a0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
78b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69  );.}../*.** Desi
78c0: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
78d0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
78e0: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
78f0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
7900: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
7910: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
7920: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
7930: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
7940: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
7950: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
7960: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
7970: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
7980: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
7990: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
79a0: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
79b0: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
79c0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
79d0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
79e0: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
79f0: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
7a00: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
7a10: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
7a20: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
7a30: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
7a40: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
7a50: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
7a60: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
7a70: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
7a80: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
7a90: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
7aa0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
7ab0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
7ac0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
7ad0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
7ae0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
7af0: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
7b00: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
7b10: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
7b20: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
7b30: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
7b40: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
7b50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
7b60: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
7b70: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
7b80: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
7b90: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
7ba0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
7bb0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
7bc0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
7bd0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
7be0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
7bf0: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
7c00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
7c10: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
7c20: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7c30: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
7c40: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
7c50: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
7c60: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
7c70: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
7c80: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
7c90: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
7ca0: 20 69 6e 74 20 61 75 74 6f 49 6e 63 20 20 20 20   int autoInc    
7cb0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7cc0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
7cd0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
7ce0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
7cf0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
7d00: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
7d10: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
7d20: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
7d30: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  i;.  if( pTab==0
7d40: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
7d50: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
7d60: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
7d70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7d80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7d90: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
7da0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
7db0: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
7dc0: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
7dd0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
7de0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
7df0: 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69  }.  pTab->hasPri
7e00: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  mKey = 1;.  if( 
7e10: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
7e20: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
7e30: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d  l - 1;.    pTab-
7e40: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
7e50: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  imKey = 1;.  }el
7e60: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
7e70: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
7e80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
7e90: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
7ea0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
7eb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
7ec0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
7ed0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
7ee0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7ef0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
7f00: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7f20: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
7f30: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54  <pTab->nCol ) pT
7f40: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
7f50: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
7f60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
7f70: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f  t->nExpr>1 ) iCo
7f80: 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  l = -1;.  }.  if
7f90: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
7fa0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
7fb0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
7fc0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
7fd0: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  pe;.  }.  if( zT
7fe0: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
7ff0: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
8000: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
8010: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
8020: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
8030: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
8040: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74  r;.    pTab->aut
8050: 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a  oInc = autoInc;.
8060: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
8070: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
8080: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
8090: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
80a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
80b0: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
80c0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
80d0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
80e0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
80f0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
8100: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  f.  }else{.    s
8110: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
8120: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
8130: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
8140: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c  r, 0, 0);.    pL
8150: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
8160: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
8170: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8180: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
8190: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
81a0: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
81b0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66  tion function of
81c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
81d0: 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20  ly parsed table 
81e0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65  column.** to the
81f0: 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a   CollSeq given..
8200: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8210: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
8220: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
8230: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
8240: 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61  int nType){.  Ta
8250: 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20  ble *p;.  Index 
8260: 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pIdx;.  CollSeq
8270: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
8280: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
8290: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
82a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
82b0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a  i = p->nCol-1;..
82c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
82d0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
82e0: 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54  Parse, zType, nT
82f0: 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b  ype);.  p->aCol[
8300: 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  i].pColl = pColl
8310: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
8320: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
8330: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
8340: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
8350: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74   <type>",.  ** t
8360: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
8370: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
8380: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
8390: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a  n before the.  *
83a0: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
83b0: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
83c0: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
83d0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f  s the case..  */
83e0: 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d  .  for(pIdx = p-
83f0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
8400: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
8410: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
8420: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  dx->nColumn==1 )
8430: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
8440: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
8450: 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
8460: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[0] = pColl;
8470: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  .  }.}../*.** Lo
8480: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
8490: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
84a0: 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61  e db.aCollSeq ha
84b0: 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
84c0: 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66   entry.** specif
84d0: 69 65 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64  ied by zName and
84e0: 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f   nName is not fo
84f0: 75 6e 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65  und and paramete
8500: 72 20 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a  r 'create' is.**
8510: 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61   true, then crea
8520: 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 20  te a new entry. 
8530: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
8540: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63   NULL..**.** Eac
8550: 68 20 70 6f 69 6e 74 65 72 20 73 74 6f 72 65 64  h pointer stored
8560: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e   in the sqlite3.
8570: 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61  aCollSeq hash ta
8580: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a  ble contains an.
8590: 2a 2a 20 61 72 72 61 79 20 6f 66 20 74 68 72 65  ** array of thre
85a0: 65 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74  e CollSeq struct
85b0: 75 72 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  ures. The first 
85c0: 69 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  is the collation
85d0: 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65   sequence.** pre
85e0: 66 66 65 72 72 65 64 20 66 6f 72 20 55 54 46 2d  fferred for UTF-
85f0: 38 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 55 54  8, the second UT
8600: 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74 68 65 20  F-16le, and the 
8610: 74 68 69 72 64 20 55 54 46 2d 31 36 62 65 2e 0a  third UTF-16be..
8620: 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d  **.** Stored imm
8630: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
8640: 68 65 20 74 68 72 65 65 20 63 6f 6c 6c 61 74 69  he three collati
8650: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 69 73 20  on sequences is 
8660: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
8670: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8680: 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e  nce name. A poin
8690: 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72 69  ter to this stri
86a0: 6e 67 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  ng is stored in.
86b0: 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f  ** each collatio
86c0: 6e 20 73 65 71 75 65 6e 63 65 20 73 74 72 75 63  n sequence struc
86d0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
86e0: 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f  CollSeq * findCo
86f0: 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20 20 73 71  llSeqEntry(.  sq
8700: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
8710: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
8720: 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69    int nName,.  i
8730: 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43  nt create.){.  C
8740: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
8750: 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e   if( nName<0 ) n
8760: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
8770: 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20  ame);.  pColl = 
8780: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
8790: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a  &db->aCollSeq, z
87a0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20  Name, nName);.. 
87b0: 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26   if( 0==pColl &&
87c0: 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20 20 70   create ){.    p
87d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Coll = sqliteMal
87e0: 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70  loc( 3*sizeof(*p
87f0: 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Coll) + nName + 
8800: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
8810: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
8820: 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68  l[0].zName = (ch
8830: 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20  ar*)&pColl[3];. 
8840: 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e       pColl[0].en
8850: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
8860: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e  .      pColl[1].
8870: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
8880: 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20  pColl[3];.      
8890: 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53  pColl[1].enc = S
88a0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20  QLITE_UTF16LE;. 
88b0: 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e       pColl[2].zN
88c0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ame = (char*)&pC
88d0: 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43  oll[3];.      pC
88e0: 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c  oll[2].enc = SQL
88f0: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20  ITE_UTF16BE;.   
8900: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b     memcpy(pColl[
8910: 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  0].zName, zName,
8920: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   nName);.      p
8930: 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e  Coll[0].zName[nN
8940: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
8950: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
8960: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  t(&db->aCollSeq,
8970: 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c   pColl[0].zName,
8980: 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a   nName, pColl);.
8990: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
89a0: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
89b0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
89c0: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 55  me points to a U
89d0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
89e0: 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65 73 20  ing nName bytes 
89f0: 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  long..** Return 
8a00: 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69  the CollSeq* poi
8a10: 6e 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6c  nter for the col
8a20: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8a30: 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66  named zName.** f
8a40: 6f 72 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  or the encoding 
8a50: 27 65 6e 63 27 20 66 72 6f 6d 20 74 68 65 20 64  'enc' from the d
8a60: 61 74 61 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a  atabase 'db'..**
8a70: 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e 74 72 79  .** If the entry
8a80: 20 73 70 65 63 69 66 69 65 64 20 69 73 20 6e 6f   specified is no
8a90: 74 20 66 6f 75 6e 64 20 61 6e 64 20 27 63 72 65  t found and 'cre
8aa0: 61 74 65 27 20 69 73 20 74 72 75 65 2c 20 74 68  ate' is true, th
8ab0: 65 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e  en create a.** n
8ac0: 65 77 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72  ew entry.  Other
8ad0: 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  wise return NULL
8ae0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
8af0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
8b00: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
8b10: 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e  .  u8 enc,.  con
8b20: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
8b30: 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69    int nName,.  i
8b40: 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43  nt create.){.  C
8b50: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
8b60: 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79  findCollSeqEntry
8b70: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  (db, zName, nNam
8b80: 65 2c 20 63 72 65 61 74 65 29 3b 0a 20 20 61 73  e, create);.  as
8b90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 55 54 46  sert( SQLITE_UTF
8ba0: 38 3d 3d 31 20 26 26 20 53 51 4c 49 54 45 5f 55  8==1 && SQLITE_U
8bb0: 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c  TF16LE==2 && SQL
8bc0: 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33 20 29  ITE_UTF16BE==3 )
8bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63 3e  ;.  assert( enc>
8be0: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20  =SQLITE_UTF8 && 
8bf0: 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc<=SQLITE_UTF1
8c00: 36 42 45 20 29 3b 0a 20 20 69 66 28 20 70 43 6f  6BE );.  if( pCo
8c10: 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e  ll ) pColl += en
8c20: 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  c-1;.  return pC
8c30: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  oll;.}../*.** In
8c40: 76 6f 6b 65 20 74 68 65 20 27 63 6f 6c 6c 61 74  voke the 'collat
8c50: 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c  ion needed' call
8c60: 62 61 63 6b 20 74 6f 20 72 65 71 75 65 73 74 20  back to request 
8c70: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
8c80: 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  ence.** in the d
8c90: 61 74 61 62 61 73 65 20 74 65 78 74 20 65 6e 63  atabase text enc
8ca0: 6f 64 69 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e  oding of name zN
8cb0: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
8cc0: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c  e..** If the col
8cd0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a  lation sequence.
8ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
8cf0: 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71  allCollNeeded(sq
8d00: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
8d10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
8d20: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65  t nName){.  asse
8d30: 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65  rt( !db->xCollNe
8d40: 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f  eded || !db->xCo
8d50: 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b 0a 20 20  llNeeded16 );.  
8d60: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e  if( nName<0 ) nN
8d70: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
8d80: 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78  me);.  if( db->x
8d90: 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20  CollNeeded ){.  
8da0: 20 20 63 68 61 72 20 2a 7a 45 78 74 65 72 6e 61    char *zExterna
8db0: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
8dc0: 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  p(zName, nName);
8dd0: 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72  .    if( !zExter
8de0: 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nal ) return;.  
8df0: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
8e00: 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65  d(db->pCollNeede
8e10: 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64  dArg, db, (int)d
8e20: 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61  b->enc, zExterna
8e30: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
8e40: 65 65 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20  ee(zExternal);. 
8e50: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8e60: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
8e70: 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  f( db->xCollNeed
8e80: 65 64 31 36 20 29 7b 0a 20 20 20 20 63 68 61 72  ed16 ){.    char
8e90: 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61   const *zExterna
8ea0: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  l;.    sqlite3_v
8eb0: 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c  alue *pTmp = sql
8ec0: 69 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74  ite3GetTransient
8ed0: 56 61 6c 75 65 28 64 62 29 3b 0a 20 20 20 20 73  Value(db);.    s
8ee0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
8ef0: 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d  r(pTmp, -1, zNam
8f00: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
8f10: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8f20: 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20      zExternal = 
8f30: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
8f40: 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54  (pTmp, SQLITE_UT
8f50: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
8f60: 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29  if( !zExternal )
8f70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d   return;.    db-
8f80: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64  >xCollNeeded16(d
8f90: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
8fa0: 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e  g, db, (int)db->
8fb0: 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b  enc, zExternal);
8fc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
8fd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8fe0: 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  e is called if t
8ff0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9000: 74 6f 72 79 20 66 61 69 6c 73 20 74 6f 20 64 65  tory fails to de
9010: 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61  liver a.** colla
9020: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e  tion function in
9030: 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f 64 69   the best encodi
9040: 6e 67 20 62 75 74 20 74 68 65 72 65 20 6d 61 79  ng but there may
9050: 20 62 65 20 6f 74 68 65 72 20 76 65 72 73 69 6f   be other versio
9060: 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f  ns.** of this co
9070: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
9080: 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65 78 74   (for other text
9090: 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76 61 69   encodings) avai
90a0: 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a  lable. Use one.*
90b0: 2a 20 6f 66 20 74 68 65 73 65 20 69 6e 73 74 65  * of these inste
90c0: 61 64 20 69 66 20 74 68 65 79 20 65 78 69 73 74  ad if they exist
90d0: 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d 38 20  . Avoid a UTF-8 
90e0: 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76 65  <-> UTF-16 conve
90f0: 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73  rsion if.** poss
9100: 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ible..*/.static 
9110: 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71  int synthCollSeq
9120: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9130: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
9140: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
9150: 6c 32 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20  l2;.  char *z = 
9160: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
9170: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
9180: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
9190: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
91a0: 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
91b0: 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d   const u8 aEnc[]
91c0: 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55 54 46 31   = { SQLITE_UTF1
91d0: 36 42 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  6BE, SQLITE_UTF1
91e0: 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  6LE, SQLITE_UTF8
91f0: 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   };.  for(i=0; i
9200: 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  <3; i++){.    pC
9210: 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69  oll2 = sqlite3Fi
9220: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45  ndCollSeq(db, aE
9230: 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b  nc[i], z, n, 0);
9240: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d  .    if( pColl2-
9250: 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20  >xCmp!=0 ){.    
9260: 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20    memcpy(pColl, 
9270: 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43  pColl2, sizeof(C
9280: 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20 20 20 20  ollSeq));.      
9290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
92a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
92b0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
92c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
92d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
92e0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
92f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e  ion sequence: %.
9300: 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d 0a  *s", n, z);.  }.
9310: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
9320: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9330: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
9340: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9350: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f  s called on a co
9360: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9370: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75 73   before it is us
9380: 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74  ed to.** check t
9390: 68 61 74 20 69 74 20 69 73 20 64 65 66 69 6e 65  hat it is define
93a0: 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65 64 20  d. An undefined 
93b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
93c0: 63 65 20 65 78 69 73 74 73 20 77 68 65 6e 0a 2a  ce exists when.*
93d0: 2a 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  * a database is 
93e0: 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f 6e 74  loaded that cont
93f0: 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  ains references 
9400: 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  to collation seq
9410: 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20 68  uences.** that h
9420: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64 65 66  ave not been def
9430: 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ined by sqlite3_
9440: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
9450: 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66  () etc..**.** If
9460: 20 72 65 71 75 69 72 65 64 2c 20 74 68 69 73 20   required, this 
9470: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68  routine calls th
9480: 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  e 'collation nee
9490: 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ded' callback to
94a0: 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20 64 65  .** request a de
94b0: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
94c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
94d0: 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f 65 73  ce. If this does
94e0: 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e  n't work, .** an
94f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c   equivalent coll
9500: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
9510: 68 61 74 20 75 73 65 73 20 61 20 74 65 78 74 20  hat uses a text 
9520: 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65 72 65  encoding differe
9530: 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d  nt.** from the m
9540: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
9550: 73 75 62 73 74 69 74 75 74 65 64 2c 20 69 66 20  substituted, if 
9560: 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  one is available
9570: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9580: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72  CheckCollSeq(Par
9590: 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
95a0: 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
95b0: 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f  f( pColl && !pCo
95c0: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
95d0: 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* No collation 
95e0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
95f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 65   type for this e
9600: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73  ncoding is regis
9610: 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61  tered..    ** Ca
9620: 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ll the collation
9630: 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20   factory to see 
9640: 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79  if it can supply
9650: 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20   us with one..  
9660: 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c    */.    callCol
9670: 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e  lNeeded(pParse->
9680: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
9690: 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e  , strlen(pColl->
96a0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69 66 28  zName));.    if(
96b0: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26   !pColl->xCmp &&
96c0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50   synthCollSeq(pP
96d0: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a  arse, pColl) ){.
96e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
96f0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
9700: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9710: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9720: 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 68  * Call sqlite3Ch
9730: 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72  eckCollSeq() for
9740: 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73   all collating s
9750: 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20 69  equences in an i
9760: 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ndex,.** in orde
9770: 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  r to verify that
9780: 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61   all the necessa
9790: 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ry collating seq
97a0: 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f  uences are.** lo
97b0: 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  aded..*/.int sql
97c0: 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f  ite3CheckIndexCo
97d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
97e0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
97f0: 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b  ){.  if( pIdx ){
9800: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9810: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
9820: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
9830: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9840: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
9850: 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49  arse, pIdx->keyI
9860: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b  nfo.aColl[i]) ){
9870: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9880: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9890: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
98a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
98b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
98c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
98d0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
98e0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
98f0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
9900: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
9910: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
9920: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
9930: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
9940: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
9950: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
9960: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
9970: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
9980: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
9990: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
99a0: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
99b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
99c0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
99d0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
99e0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
99f0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
9a00: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
9a10: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
9a20: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
9a30: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
9a40: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
9a50: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
9a60: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
9a70: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
9a80: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
9a90: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9aa0: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
9ab0: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
9ac0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
9ad0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
9ae0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
9af0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
9b00: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
9b10: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f  ** pParse..*/.Co
9b20: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
9b30: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
9b40: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9b50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
9b60: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65  t nName){.  u8 e
9b70: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
9b80: 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62  >enc;.  u8 initb
9b90: 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  usy = pParse->db
9ba0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43  ->init.busy;.  C
9bb0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9bc0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9bd0: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65  eq(pParse->db, e
9be0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
9bf0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
9c00: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61  f( nName<0 ) nNa
9c10: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
9c20: 65 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  e);.  if( !initb
9c30: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
9c40: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
9c50: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c  ){.    /* No col
9c60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9c70: 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f 72  of this type for
9c80: 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69   this encoding i
9c90: 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20  s registered..  
9ca0: 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f    ** Call the co
9cb0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9cc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
9cd0: 20 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20   supply us with 
9ce0: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
9cf0: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70  callCollNeeded(p
9d00: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
9d10: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43  , nName);.    pC
9d20: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
9d30: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
9d40: 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  >db, enc, zName,
9d50: 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   nName, 0);.    
9d60: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43  if( pColl && !pC
9d70: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
9d80: 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 61 79 20     /* There may 
9d90: 62 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  be a version of 
9da0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
9db0: 71 75 65 6e 63 65 20 74 68 61 74 20 72 65 71 75  quence that requ
9dc0: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 72  ires.      ** tr
9dd0: 61 6e 73 6c 61 74 69 6f 6e 20 62 65 74 77 65 65  anslation betwee
9de0: 6e 20 65 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61  n encodings. Sea
9df0: 72 63 68 20 66 6f 72 20 69 74 20 77 69 74 68 20  rch for it with 
9e00: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a  synthCollSeq()..
9e10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
9e20: 66 28 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  f( synthCollSeq(
9e30: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
9e40: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
9e50: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
9e60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
9e70: 6f 74 68 69 6e 67 20 68 61 73 20 62 65 65 6e 20  othing has been 
9e80: 66 6f 75 6e 64 2c 20 77 72 69 74 65 20 74 68 65  found, write the
9e90: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9ea0: 6e 74 6f 20 70 50 61 72 73 65 20 2a 2f 0a 20 20  nto pParse */.  
9eb0: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
9ec0: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
9ed0: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
9ee0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
9ef0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  r==0 ){.      sq
9f00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9f10: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
9f20: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9f30: 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c  e: %.*s", nName,
9f40: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
9f50: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
9f60: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
9f70: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
9f80: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
9f90: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
9fa0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
9fb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
9fc0: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
9fd0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
9fe0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
9ff0: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
a000: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
a010: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
a020: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
a030: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
a040: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
a050: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
a060: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
a070: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
a080: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
a090: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
a0a0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
a0b0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
a0c0: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
a0d0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
a0e0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
a0f0: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
a100: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
a110: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
a120: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
a130: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
a140: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
a150: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
a160: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
a170: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
a180: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
a190: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
a1a0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
a1b0: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
a1c0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
a1d0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
a1e0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
a1f0: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
a200: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
a210: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
a220: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
a230: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
a240: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
a250: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
a260: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
a270: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
a280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a290: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
a2a0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
a2b0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
a2c0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
a2d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
a2e0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
a2f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a300: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a310: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a320: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a330: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a340: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a350: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a360: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a370: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a380: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a390: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a3a0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a3b0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a3c0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a3d0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a3e0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a3f0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a400: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a410: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a420: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a430: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a440: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a450: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
a460: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
a470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
a480: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
a490: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
a4a0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
a4b0: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
a4c0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
a4d0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
a4e0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
a4f0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
a500: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
a510: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
a520: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
a530: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
a540: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
a550: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
a560: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
a570: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
a580: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
a590: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
a5a0: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
a5b0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
a5c0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
a5d0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
a5e0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
a5f0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a610: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
a620: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
a630: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
a640: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a650: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
a660: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a670: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
a680: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
a690: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
a6a0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
a6b0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
a6c0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
a6d0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
a6e0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
a6f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a700: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a710: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
a720: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
a730: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
a740: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
a750: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
a760: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
a770: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a780: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
a790: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
a7a0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a7b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
a7c0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
a7d0: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a  Stmt(Table *p){.
a7e0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
a7f0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
a800: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
a810: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
a820: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
a830: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
a840: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
a850: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a860: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a870: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
a880: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
a890: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
a8a0: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
a8b0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
a8c0: 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20  len(z) + 1);.   
a8d0: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
a8e0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
a8f0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
a900: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
a910: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
a920: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
a930: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
a940: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
a950: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
a960: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
a970: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
a980: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
a990: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
a9a0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
a9b0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
a9c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
a9d0: 72 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69  rcpy(zStmt, p->i
a9e0: 44 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20  Db==1 ? "CREATE 
a9f0: 54 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22  TEMP TABLE " : "
aa00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
aa10: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
aa20: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
aa30: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
aa40: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
aa50: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
aa60: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
aa70: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
aa80: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
aa90: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
aaa0: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
aab0: 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74  += strlen(&zStmt
aac0: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
aad0: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
aae0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
aaf0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
ab00: 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d    if( (z = pCol-
ab10: 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20  >zType)!=0 ){.  
ab20: 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d      zStmt[k++] =
ab30: 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63   ' ';.      strc
ab40: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29  py(&zStmt[k], z)
ab50: 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72  ;.      k += str
ab60: 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  len(z);.    }.  
ab70: 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d  }.  strcpy(&zStm
ab80: 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  t[k], zEnd);.  r
ab90: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
aba0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
abb0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
abc0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
abd0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
abe0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
abf0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ac00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
ac10: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
ac20: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
ac30: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
ac40: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
ac50: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
ac60: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
ac70: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
ac80: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
ac90: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
aca0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
acb0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
acc0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
acd0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
ace0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
acf0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
ad00: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
ad10: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
ad20: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
ad30: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
ad40: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
ad50: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
ad60: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
ad70: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
ad80: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
ad90: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
ada0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
adb0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
adc0: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
add0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
ade0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
adf0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
ae00: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
ae10: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
ae20: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
ae30: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
ae40: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
ae50: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
ae60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
ae70: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
ae80: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
ae90: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
aea0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
aeb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
aec0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
aed0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
aee0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
aef0: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
af00: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
af10: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
af20: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
af30: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
af40: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
af50: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
af60: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
af70: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
af80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
af90: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28  se->db;..  if( (
afa0: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
afb0: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
afc0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
afd0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
afe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
aff0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b000: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
b010: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
b020: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
b030: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
b040: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
b050: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
b060: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
b070: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
b080: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
b090: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
b0a0: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
b0b0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
b0c0: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
b0d0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
b0e0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
b0f0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
b100: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
b110: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
b120: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
b130: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
b140: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
b150: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
b160: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
b170: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
b180: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
b190: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
b1a0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
b1b0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
b1c0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
b1d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
b1e0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
b1f0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
b200: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
b210: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
b220: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
b230: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
b240: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
b250: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
b260: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b270: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
b280: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
b290: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
b2a0: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
b2b0: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
b2c0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
b2d0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
b2e0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
b2f0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
b300: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
b310: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
b320: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
b330: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
b340: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
b350: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
b360: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
b370: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
b380: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
b390: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
b3a0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
b3b0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
b3c0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
b3d0: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
b3e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
b3f0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
b400: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
b410: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
b420: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
b430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b440: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
b450: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
b460: 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
b470: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20  e new table and 
b480: 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
b490: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41   stack..    ** A
b4a0: 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f   view has no roo
b4b0: 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70  tpage, so just p
b4c0: 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20  ush a zero onto 
b4d0: 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20  the stack for.  
b4e0: 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69    ** views.  Ini
b4f0: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74  tialize zType at
b500: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
b510: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b520: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
b530: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
b540: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
b550: 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
b560: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
b570: 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c  teTable, p->iDb,
b580: 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 54   0); */.      zT
b590: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
b5a0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
b5b0: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
b5c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
b5d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b5e0: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
b5f0: 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 56 64 62    /*  sqlite3Vdb
b600: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b610: 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a  eger, 0, 0); */.
b620: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
b630: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
b640: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
b650: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
b660: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
b670: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
b680: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
b690: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
b6a0: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
b6b0: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
b6c0: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
b6d0: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
b6e0: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
b6f0: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e   new table is on
b700: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
b710: 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20  vdbe stack..    
b720: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
b730: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
b740: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
b750: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
b760: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
b770: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
b780: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
b790: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
b7a0: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
b7b0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
b7c0: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  ew table..    */
b7d0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
b7e0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
b7f0: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20  *pSelTab;.      
b800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b810: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
b820: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b830: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b840: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c  Integer, p->iDb,
b850: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b860: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b870: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
b880: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
b890: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
b8a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
b8b0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
b8c0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
b8d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b8f0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b900: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
b910: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
b920: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
b930: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
b940: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
b950: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
b960: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
b970: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
b980: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
b990: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
b9a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
b9b0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
b9c0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
b9d0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
b9e0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
b9f0: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
ba00: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
ba10: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
ba20: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
ba30: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
ba40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ba50: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ba60: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
ba70: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
ba80: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ba90: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
baa0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
bab0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70  reateTableStmt(p
bac0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bad0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
bae0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
baf0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
bb00: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53  z) + 1;.      zS
bb10: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
bb20: 69 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20  intf("CREATE %s 
bb30: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
bb40: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
bb50: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a  oken.z);.    }..
bb60: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
bb70: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
bb80: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
bb90: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
bba0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
bbb0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
bbc0: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
bbd0: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
bbe0: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
bbf0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
bc00: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20  've collected.  
bc10: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
bc20: 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20  e preallocated. 
bc30: 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68     ** slot is th
bc40: 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68  e 2nd item on th
bc50: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f  e stack.  The to
bc60: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
bc70: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  s the.    ** roo
bc80: 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  t page for the n
bc90: 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30  ew table (or a 0
bca0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69   if this is a vi
bcb0: 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ew)..    */.    
bcc0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
bcd0: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
bce0: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
bcf0: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
bd00: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
bd10: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
bd20: 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c  rootpage=#0, sql
bd30: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
bd40: 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20  ERE rowid=#1",. 
bd50: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e       db->aDb[p->
bd60: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
bd70: 4d 41 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62 29  MA_TABLE(p->iDb)
bd80: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
bd90: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
bda0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
bdb0: 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
bdc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
bdd0: 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (zStmt);.    sql
bde0: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
bdf0: 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b  (db, v, p->iDb);
be00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
be10: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
be20: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
be30: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
be40: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
be50: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
be60: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
be70: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
be80: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
be90: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
bea0: 20 69 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20   if( p->autoInc 
beb0: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
bec0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69   = &db->aDb[p->i
bed0: 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Db];.      if( p
bee0: 44 62 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  Db->pSeqTab==0 )
bef0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bf00: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
bf10: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
bf20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
bf30: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
bf40: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
bf50: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
bf60: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
bf70: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
bf80: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
bf90: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
bfa0: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
bfb0: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
bfc0: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
bfd0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
bfe0: 61 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69  arseSchema, p->i
bff0: 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73  Db, 0,.        s
c000: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74  qlite3MPrintf("t
c010: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d  bl_name='%q'",p-
c020: 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
c030: 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  MIC);.  }...  /*
c040: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
c050: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
c060: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
c070: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
c080: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
c090: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
c0a0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
c0b0: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
c0c0: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
c0d0: 20 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20   .    Db *pDb = 
c0e0: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
c0f0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
c100: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
c110: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  pDb->tblHash, p-
c120: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
c130: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
c140: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
c150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
c160: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
c170: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
c180: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
c190: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
c1a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c1b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c1c0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
c1d0: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
c1e0: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
c1f0: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
c200: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
c210: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
c220: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
c230: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
c240: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61  xtTo = sqlite3Ha
c250: 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b  shFind(&pDb->aFK
c260: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c270: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nTo);.      sqli
c280: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
c290: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
c2a0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65  ->zTo, nTo, pFKe
c2b0: 79 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  y);.    }.#endif
c2c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
c2d0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
c2e0: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
c2f0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
c300: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
c310: 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ges;.  }.}..#ifn
c320: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c330: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
c340: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
c350: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
c360: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
c370: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
c380: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
c390: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c3a0: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
c3b0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c3c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
c3d0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
c3e0: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
c3f0: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
c400: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
c410: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
c420: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
c430: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
c440: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
c450: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
c460: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
c470: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
c480: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
c490: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c4a0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
c4b0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
c4c0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
c4d0: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
c4e0: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
c4f0: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
c500: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
c510: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
c520: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
c530: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
c540: 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
c550: 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
c560: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
c570: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72  ;..  sqlite3Star
c580: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
c590: 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70  Begin, pName1, p
c5a0: 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
c5b0: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
c5c0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
c5d0: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
c5e0: 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
c5f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c600: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
c610: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
c620: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
c630: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
c640: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
c650: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
c660: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
c670: 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76  arse, p->iDb, "v
c680: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
c690: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65   && sqlite3FixSe
c6a0: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
c6b0: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
c6c0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c6d0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
c6e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
c6f0: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
c700: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
c710: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
c720: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
c730: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
c740: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
c750: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
c760: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
c770: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
c780: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
c790: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
c7a0: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
c7b0: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
c7c0: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
c7d0: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
c7e0: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
c7f0: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
c800: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
c810: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
c820: 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63  SelectDup(pSelec
c830: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
c840: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c850: 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  t);.  if( !pPars
c860: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
c870: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c880: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
c890: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
c8a0: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
c8b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
c8c0: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
c8d0: 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
c8e0: 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
c8f0: 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
c900: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
c910: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  stToken;.  if( s
c920: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73  End.z[0]!=0 && s
c930: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
c940: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
c950: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
c960: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73  d.n = 0;.  n = s
c970: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
c980: 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  z;.  z = (const 
c990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
c9a0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
c9b0: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
c9c0: 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63  ]==';' || isspac
c9d0: 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d  e(z[n-1])) ){ n-
c9e0: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
c9f0: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
ca00: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
ca10: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
ca20: 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
ca30: 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
ca40: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
ca50: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
ca60: 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64  le(pParse, &sEnd
ca70: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
ca80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ca90: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
caa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cab0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
cac0: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
cad0: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
cae0: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
caf0: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
cb00: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
cb10: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
cb20: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
cb30: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
cb40: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
cb50: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
cb60: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
cb70: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
cb80: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
cb90: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
cba0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
cbb0: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
cbc0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
cbd0: 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
cbe0: 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
cbf0: 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
cc00: 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
cc10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
cc20: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
cc30: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
cc40: 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
cc50: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
cc60: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
cc70: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
cc80: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
cc90: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
cca0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
ccb0: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
ccc0: 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
ccd0: 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
cce0: 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  gned */..  asser
ccf0: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
cd00: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
cd10: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
cd20: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
cd30: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
cd40: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
cd50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
cd60: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
cd70: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
cd80: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
cd90: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
cda0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
cdb0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
cdc0: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
cdd0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
cde0: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
cdf0: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
ce00: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
ce10: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
ce20: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
ce30: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
ce40: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
ce50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
ce60: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
ce70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
ce80: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
ce90: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
cea0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
ceb0: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
cec0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
ced0: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
cee0: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
cef0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
cf00: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
cf10: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
cf20: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
cf30: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
cf40: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
cf50: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
cf60: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
cf70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
cf80: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
cf90: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
cfa0: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
cfb0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
cfc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
cfd0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
cfe0: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
cff0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
d000: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
d010: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
d020: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
d030: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
d040: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
d050: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
d060: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
d070: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
d080: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
d090: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
d0a0: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
d0b0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
d0c0: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
d0d0: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
d0e0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
d0f0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
d100: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
d110: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
d120: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
d130: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
d140: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
d150: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
d160: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
d170: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
d180: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
d190: 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  up(pTable->pSele
d1a0: 63 74 29 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  ct);.  n = pPars
d1b0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74  e->nTab;.  sqlit
d1c0: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
d1d0: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
d1e0: 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 70 54  Sel->pSrc);.  pT
d1f0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
d200: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
d210: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
d220: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
d230: 20 70 53 65 6c 29 3b 0a 20 20 70 50 61 72 73 65   pSel);.  pParse
d240: 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 69 66  ->nTab = n;.  if
d250: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
d260: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
d270: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
d280: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
d290: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
d2a0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
d2b0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
d2c0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
d2d0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  l = 0;.    pSelT
d2e0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
d2f0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
d300: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
d310: 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  ;.    DbSetPrope
d320: 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  rty(pParse->db, 
d330: 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f  pTable->iDb, DB_
d340: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20  UnresetViews);. 
d350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
d360: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
d370: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
d380: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
d390: 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 72 65 74  ete(pSel);.  ret
d3a0: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
d3b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d3c0: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
d3d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d3e0: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
d3f0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
d400: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
d410: 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
d420: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
d430: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
d440: 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
d450: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
d460: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
d470: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
d480: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
d490: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
d4a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
d4b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
d4c0: 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61  ->aDb[idx].tblHa
d4d0: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
d4e0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
d4f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
d500: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
d510: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
d520: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d530: 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c    sqliteResetCol
d540: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a  umnNames(pTab);.
d550: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
d560: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
d570: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
d580: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
d590: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
d5a0: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
d5b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d5c0: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
d5d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d5e0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
d5f0: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
d600: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
d610: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
d620: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
d630: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
d640: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
d650: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
d660: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
d670: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
d680: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
d690: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
d6a0: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f  om.** to iTo..*/
d6b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d6c0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d6d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
d6e0: 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44  PageMoved(Db *pD
d6f0: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
d700: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
d710: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20  em *pElem;.  .  
d720: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
d730: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
d740: 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  tblHash); pElem;
d750: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
d760: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
d770: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
d780: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
d790: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
d7a0: 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
d7b0: 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
d7c0: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
d7d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
d7e0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d  .  }.  for(pElem
d7f0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
d800: 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b  (&pDb->idxHash);
d810: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
d820: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
d830: 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
d840: 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
d850: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
d860: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
d870: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
d880: 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
d890: 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  To;.      return
d8a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
d8b0: 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69  sert(0);.}.#endi
d8c0: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
d8d0: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
d8e0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
d8f0: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
d900: 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
d910: 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
d920: 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
d930: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d940: 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
d950: 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
d960: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
d970: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
d980: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
d990: 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
d9a0: 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
d9b0: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
d9c0: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
d9d0: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
d9e0: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
d9f0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
da00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
da10: 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
da20: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
da30: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
da40: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
da50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
da60: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
da70: 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65  le, iDb);.#ifnde
da80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
da90: 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
daa0: 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73 20  _Destroy pushes 
dab0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20  an integer onto 
dac0: 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68  the stack. If th
dad0: 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
dae0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
daf0: 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
db00: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
db10: 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
db20: 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
db30: 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
db40: 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
db50: 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
db60: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
db70: 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
db80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
db90: 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  #0" in the SQL i
dba0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
dbb0: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
dbc0: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
dbd0: 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f   ** is on the to
dbe0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
dbf0: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
dc00: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
dc10: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
dc20: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
dc30: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
dc40: 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
dc50: 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72  d WHERE #0 AND r
dc60: 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20  ootpage=#0",.   
dc70: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
dc80: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
dc90: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
dca0: 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66   iTable);.#endif
dcb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
dcc0: 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
dcd0: 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
dce0: 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
dcf0: 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
dd00: 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
dd10: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
dd20: 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
dd30: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
dd40: 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
dd50: 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
dd60: 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
dd70: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
dd80: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
dd90: 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
dda0: 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
ddb0: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
ddc0: 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
ddd0: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
dde0: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
ddf0: 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
de00: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
de10: 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
de20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
de30: 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  UM.  Index *pIdx
de40: 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
de50: 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
de60: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44  ->tnum, pTab->iD
de70: 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
de80: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
de90: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
dea0: 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
deb0: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
dec0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49  , pIdx->tnum, pI
ded0: 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65  dx->iDb);.  }.#e
dee0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
def0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
df00: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
df10: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
df20: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
df30: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
df40: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
df50: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
df60: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
df70: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
df80: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
df90: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
dfa0: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
dfb0: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
dfc0: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
dfd0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
dfe0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
dff0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
e000: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
e010: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
e020: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
e030: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
e040: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
e050: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
e060: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
e070: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
e080: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
e090: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
e0a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
e0b0: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
e0c0: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
e0d0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
e0e0: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
e0f0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
e100: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
e110: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
e120: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
e130: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
e140: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
e150: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
e160: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
e170: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
e180: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
e190: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
e1a0: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
e1b0: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
e1c0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
e1d0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
e1e0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
e1f0: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
e200: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
e210: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
e220: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
e230: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
e240: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
e250: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e260: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e270: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
e280: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
e290: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
e2a0: 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62   pIdx->iDb==pTab
e2b0: 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20 69  ->iDb );.      i
e2c0: 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
e2d0: 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
e2e0: 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
e2f0: 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
e300: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
e310: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
e320: 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
e330: 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  est==0 ) return;
e340: 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
e350: 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
e360: 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44 62  rgest, pTab->iDb
e370: 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79 65  );.    iDestroye
e380: 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
e390: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
e3a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e3b0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
e3c0: 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
e3d0: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
e3e0: 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
e3f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
e400: 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
e410: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
e420: 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
e430: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
e440: 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
e450: 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65  isView){.  Table
e460: 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
e470: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
e480: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e490: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
e4a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
e4b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
e4c0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
e4d0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e4e0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
e4f0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61  nSrc==1 );.  pTa
e500: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
e510: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
e520: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
e530: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
e540: 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28  atabase);..  if(
e550: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
e560: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e570: 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  .  iDb = pTab->i
e580: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
e590: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
e5a0: 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  nDb );.#ifndef S
e5b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
e5c0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
e5d0: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
e5e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
e5f0: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
e600: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63  Tab->iDb);.    c
e610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
e620: 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69   db->aDb[pTab->i
e630: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
e640: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
e650: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
e660: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
e670: 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
e680: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e690: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
e6a0: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
e6b0: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
e6c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
e6d0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
e6e0: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
e6f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
e700: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
e710: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
e720: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e730: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
e740: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
e750: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
e760: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
e770: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
e780: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
e790: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
e7a0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
e7b0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
e7c0: 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
e7d0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
e7e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
e7f0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
e800: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
e810: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
e820: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
e830: 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
e840: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
e850: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e860: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
e870: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54  .#endif.  if( pT
e880: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  ab->readOnly || 
e890: 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44  pTab==db->aDb[iD
e8a0: 62 5d 2e 70 53 65 71 54 61 62 20 29 7b 0a 20 20  b].pSeqTab ){.  
e8b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e8c0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
e8d0: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
e8e0: 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
e8f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
e900: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e910: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
e920: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
e930: 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20   /* Ensure DROP 
e940: 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65  TABLE is not use
e950: 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64  d on a view, and
e960: 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f   DROP VIEW is no
e970: 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61  t used.  ** on a
e980: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
e990: 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
e9a0: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
e9b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e9c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
e9d0: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
e9e0: 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
e9f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
ea00: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
ea10: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
ea20: 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
ea30: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
ea40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ea50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
ea60: 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
ea70: 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
ea80: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
ea90: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
eaa0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  table;.  }.#endi
eab0: 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
eac0: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
ead0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
eae0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
eaf0: 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
eb00: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
eb10: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
eb20: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
eb30: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
eb40: 72 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  r;.    int iDb =
eb50: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
eb60: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
eb70: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c  Db[iDb];.    sql
eb80: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
eb90: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
eba0: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
ebb0: 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
ebc0: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
ebd0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
ebe0: 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
ebf0: 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  .    ** is gener
ec00: 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
ec10: 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
ec20: 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
ec30: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  .    ** sqlite_t
ec40: 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
ec50: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
ec60: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
ec70: 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  ab->pTrigger;.  
ec80: 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
ec90: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
eca0: 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62  t( pTrigger->iDb
ecb0: 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ==iDb || pTrigge
ecc0: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
ecd0: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
ece0: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
ecf0: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
ed00: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
ed10: 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
ed20: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
ed30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ed40: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
ed50: 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
ed60: 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
ed70: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
ed80: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ed90: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
eda0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
edb0: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
edc0: 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
edd0: 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a  s dropped.    **
ede0: 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
edf0: 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
ee00: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
ee10: 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
ee20: 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61      ** move as a
ee30: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
ee40: 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
ee50: 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
ee60: 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ode)..    */.   
ee70: 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49   if( pTab->autoI
ee80: 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nc ){.      sqli
ee90: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
eea0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
eeb0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73  DELETE FROM %s.s
eec0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
eed0: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
eee0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
eef0: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
ef00: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
ef10: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ndif..    /* Dro
ef20: 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
ef30: 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
ef40: 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
ef50: 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
ef60: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
ef70: 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
ef80: 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
ef90: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
efa0: 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
efb0: 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
efc0: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
efd0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
efe0: 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
eff0: 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
f000: 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
f010: 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
f020: 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
f030: 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
f040: 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
f050: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
f060: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
f070: 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
f080: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
f090: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
f0a0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
f0b0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
f0c0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
f0d0: 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
f0e0: 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
f0f0: 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
f100: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
f110: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
f120: 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ), pTab->zName);
f130: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
f140: 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   ){.      destro
f150: 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  yTable(pParse, p
f160: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Tab);.    }..   
f170: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
f180: 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
f190: 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
f1a0: 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
f1b0: 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ify.    ** the s
f1c0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
f1d0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
f1e0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72  VdbeOp3(v, OP_Dr
f1f0: 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
f200: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
f210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
f220: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
f230: 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   iDb);.  }.  sql
f240: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
f250: 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
f260: 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
f270: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
f280: 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
f290: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f2a0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
f2b0: 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
f2c0: 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
f2d0: 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
f2e0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f2f0: 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
f300: 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
f310: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
f320: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
f330: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
f340: 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
f350: 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
f360: 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
f370: 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
f380: 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
f390: 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
f3a0: 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
f3b0: 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54  referred to.  pT
f3c0: 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f  oCol is a list o
f3d0: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
f3e0: 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62  other.** pTo tab
f3f0: 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  le that the fore
f400: 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74  ign key points t
f410: 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  o.  flags contai
f420: 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
f430: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
f440: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
f450: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
f460: 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
f470: 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
f480: 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
f490: 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
f4a0: 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
f4b0: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
f4c0: 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
f4d0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
f4e0: 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
f4f0: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
f500: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f510: 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65  e field.  The ne
f520: 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74  w FKey.** is not
f530: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d   linked into db-
f540: 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70  >aFKey at this p
f550: 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73  oint - that does
f560: 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75   not happen.** u
f570: 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54  ntil sqlite3EndT
f580: 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  able()..**.** Th
f590: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
f5a0: 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
f5b0: 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
f5c0: 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
f5d0: 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
f5e0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
f5f0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
f600: 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
f610: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
f620: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
f630: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f640: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
f650: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f660: 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
f670: 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
f680: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
f690: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
f6a0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
f6b0: 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
f6c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
f6d0: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
f6e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
f6f0: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
f700: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
f710: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
f720: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
f730: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
f740: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
f750: 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  . */.){.#ifndef 
f760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
f770: 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
f780: 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62  pFKey = 0;.  Tab
f790: 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
f7a0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
f7b0: 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
f7c0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
f7d0: 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
f7e0: 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
f7f0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
f800: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66  e->nErr ) goto f
f810: 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
f820: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
f830: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
f840: 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
f850: 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
f860: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
f870: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
f880: 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
f890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f8a0: 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
f8b0: 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
f8c0: 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
f8d0: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
f8e0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
f8f0: 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
f900: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
f910: 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
f920: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
f930: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
f940: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
f950: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
f960: 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
f970: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
f980: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f990: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
f9a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f9b0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
f9c0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
f9d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
f9e0: 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
f9f0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
fa00: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
fa10: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
fa20: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
fa30: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
fa40: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
fa50: 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e  zeof(*pFKey) + n
fa60: 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  Col*sizeof(pFKey
fa70: 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
fa80: 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
fa90: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
faa0: 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
fab0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
fac0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
fad0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
fae0: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
faf0: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
fb00: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
fb10: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
fb20: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
fb30: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
fb40: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
fb50: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
fb60: 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
fb70: 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
fb80: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
fb90: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
fba0: 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
fbb0: 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
fbc0: 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
fbd0: 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
fbe0: 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
fbf0: 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
fc00: 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
fc10: 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
fc20: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
fc30: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
fc40: 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
fc50: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
fc60: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
fc70: 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
fc80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
fc90: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
fca0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
fcb0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
fcc0: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
fcd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
fce0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
fcf0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
fd00: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
fd10: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
fd20: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
fd30: 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
fd40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fd50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fd60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
fd70: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
fd80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fd90: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
fda0: 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
fdb0: 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
fdc0: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
fdd0: 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
fde0: 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
fdf0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
fe00: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
fe10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fe20: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
fe30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
fe40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
fe50: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
fe60: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
fe70: 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
fe80: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
fe90: 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
fea0: 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
feb0: 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
fec0: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
fed0: 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
fee0: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
fef0: 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
ff00: 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
ff10: 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
ff20: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
ff30: 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
ff40: 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
ff50: 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
ff60: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
ff70: 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
ff80: 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
ff90: 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
ffa0: 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
ffb0: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
ffc0: 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
ffd0: 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
ffe0: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
fff0: 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  e(pFKey);.#endif
10000 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
10010 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
10020 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
10030 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
10040 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71  (pFromCol);.  sq
10050 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
10060 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  ete(pToCol);.}..
10070 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10080 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
10090 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
100a0 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
100b0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
100c0 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
100d0 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
100e0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
100f0 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
10100 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
10110 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
10120 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
10130 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
10140 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
10150 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
10160 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10170 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
10180 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
10190 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
101a0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
101b0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
101c0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
101d0 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
101e0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
101f0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
10200 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
10210 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
10220 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
10230 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
10240 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
10250 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
10260 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
10270 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
10280 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
10290 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
102a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
102b0 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
102c0 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
102d0 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
102e0 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
102f0 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
10300 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
10310 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
10320 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
10330 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
10340 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
10350 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
10360 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
10370 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
10380 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
10390 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
103a0 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f  eated.  The memo
103b0 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65  ry cell specifie
103c0 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
103d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
103e0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
103f0 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
10400 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
10410 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
10420 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
10430 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
10440 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
10450 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
10460 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
10470 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
10480 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
10490 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
104a0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
104b0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
104c0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
104d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
104e0 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
104f0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
10500 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
10510 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
10520 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
10530 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
10540 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
10550 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20  rse->nTab;      
10560 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
10570 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
10580 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
10590 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20  Parse->nTab+1;  
105a0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
105b0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
105c0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ex */.  int addr
105d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
105e0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
105f0 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
10600 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
10630 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
10640 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10660 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10670 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
10680 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69  l machine */.  i
10690 6e 74 20 69 73 55 6e 69 71 75 65 3b 20 20 20 20  nt isUnique;    
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
106b0 20 54 72 75 65 20 66 6f 72 20 61 20 75 6e 69 71   True for a uniq
106c0 75 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66  ue index */..#if
106d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
106e0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
106f0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10700 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
10710 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49  LITE_REINDEX, pI
10720 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  ndex->zName, 0,.
10730 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
10740 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
10750 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20  b].zName ) ){.  
10760 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
10770 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  ndif..  /* Ensur
10780 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72  e all the requir
10790 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
107a0 75 65 6e 63 65 73 20 61 72 65 20 61 76 61 69 6c  uences are avail
107b0 61 62 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  able. This.  ** 
107c0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 76  routine will inv
107d0 6f 6b 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  oke the collatio
107e0 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63  n-needed callbac
107f0 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 28  k if necessary (
10800 61 6e 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  and.  ** if one 
10810 68 61 73 20 62 65 65 6e 20 72 65 67 69 73 74 65  has been registe
10820 72 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  red)..  */.  if(
10830 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64   sqlite3CheckInd
10840 65 78 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  exCollSeq(pParse
10850 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
10860 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
10870 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10880 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10890 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
108a0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
108b0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ge>=0 ){.    sql
108c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
108d0 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d   OP_MemLoad, mem
108e0 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20  RootPage, 0);.  
108f0 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65    tnum = 0;.  }e
10900 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
10910 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
10920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10930 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  Op(v, OP_Clear, 
10940 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44  tnum, pIndex->iD
10950 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
10960 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10970 5f 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78  _Integer, pIndex
10980 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  ->iDb, 0);.  sql
10990 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
109a0 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
109b0 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20  x, tnum,.       
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
109d0 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79  ar*)&pIndex->key
109e0 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
109f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10a00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
10a10 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20  ger, pTab->iDb, 
10a20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
10a30 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
10a40 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 54 61  nRead, iTab, pTa
10a50 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69  b->tnum);.  sqli
10a60 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10a70 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
10a80 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43  , iTab, pTab->nC
10a90 6f 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ol);.  addr1 = s
10aa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10ab0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
10ac0 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ab, 0);.  sqlite
10ad0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
10ae0 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61  y(v, pIndex, iTa
10af0 62 29 3b 0a 20 20 69 73 55 6e 69 71 75 65 20 3d  b);.  isUnique =
10b00 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
10b10 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c  !=OE_None;.  sql
10b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10b30 20 4f 50 5f 49 64 78 50 75 74 2c 20 69 49 64 78   OP_IdxPut, iIdx
10b40 2c 20 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 69  , isUnique);.  i
10b50 66 28 20 69 73 55 6e 69 71 75 65 20 29 7b 0a 20  f( isUnique ){. 
10b60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10b70 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69  angeP3(v, -1, "i
10b80 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
10b90 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
10ba0 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  P3_STATIC);.  }.
10bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10bc0 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
10bd0 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20  Tab, addr1+1);. 
10be0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10bf0 67 65 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73  geP2(v, addr1, s
10c00 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10c10 74 41 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c  tAddr(v));.  sql
10c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10c30 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c   OP_Close, iTab,
10c40 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
10c50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
10c60 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d  ose, iIdx, 0);.}
10c70 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
10c80 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
10c90 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e  n SQL table.  pN
10ca0 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74  ame1.pName2 is t
10cb0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
10cc0 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62  ndex .** and pTb
10cd0 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d  lList is the nam
10ce0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
10cf0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
10d00 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c  exed.  Both will
10d10 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72   .** be NULL for
10d20 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
10d30 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
10d40 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61  is created to sa
10d50 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55  tisfy a.** UNIQU
10d60 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49  E constraint.  I
10d70 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e  f pTable and pIn
10d80 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73  dex are NULL, us
10d90 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
10da0 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  ble.** as the ta
10db0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
10dc0 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  d.  pParse->pNew
10dd0 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65  Table is a table
10de0 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72   that is.** curr
10df0 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
10e00 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45  tructed by a CRE
10e10 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
10e20 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ent..**.** pList
10e30 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f   is a list of co
10e40 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
10e50 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c  xed.  pList will
10e60 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73   be NULL if this
10e70 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79  .** is a primary
10e80 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63   key or unique-c
10e90 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
10ea0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c   most recent col
10eb0 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  umn added.** to 
10ec0 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
10ed0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
10ee0 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69  uction.  .*/.voi
10ef0 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  d sqlite3CreateI
10f00 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
10f10 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
10f20 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
10f30 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
10f40 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10f50 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
10f60 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
10f70 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
10f80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10f90 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
10fa0 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
10fb0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
10fc0 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
10fd0 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
10fe0 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
10ff0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
11000 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
11010 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
11020 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
11030 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
11040 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
11050 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
11060 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
11070 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
11080 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
11090 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
110a0 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
110b0 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
110c0 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
110d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
110e0 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
110f0 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68     /* The ")" th
11100 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52  at closes the CR
11110 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
11120 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ment */.){.  Tab
11130 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
11140 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
11150 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
11160 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f  x *pIndex = 0; /
11170 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
11180 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
11190 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
111a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
111b0 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f  ken nullId;    /
111c0 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72  * Fake token for
111d0 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73   an empty ID lis
111e0 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  t */.  DbFixer s
111f0 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61  Fix;    /* For a
11200 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
11210 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
11220 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  e */.  int isTem
11230 70 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p;      /* True 
11240 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
11250 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74  index */.  sqlit
11260 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11270 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b  >db;..  int iDb;
11280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11290 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
112a0 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
112b0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
112c0 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
112d0 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
112e0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
112f0 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
11300 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
11310 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
11320 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
11330 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11340 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  dex;..  /*.  ** 
11350 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
11360 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
11370 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
11380 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
11390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
113a0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
113b0 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
113c0 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
113d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
113e0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
113f0 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
11400 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
11410 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
11420 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
11430 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
11440 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
11450 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11460 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
11470 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
11480 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
11490 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
114a0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
114b0 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
114c0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
114d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
114e0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
114f0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
11500 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
11510 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
11520 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
11530 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
11540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
11550 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
11560 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
11570 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
11580 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
11590 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
115a0 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
115b0 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44  pTab && pTab->iD
115c0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44  b==1 ){.      iD
115d0 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  b = 1;.    }..  
115e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
115f0 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
11600 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22  se, iDb, "index"
11610 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20  , pName) &&.    
11620 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72      sqlite3FixSr
11630 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
11640 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20  lName).    ){.  
11650 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
11660 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11670 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
11680 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
11690 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
116a0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  ->a[0].zName, . 
116b0 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d         pTblName-
116c0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
116d0 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
116e0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
116f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
11700 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62 2d  sert( iDb==pTab-
11710 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  >iDb );.  }else{
11720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
11730 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
11740 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
11750 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62 20  wTable;.    iDb 
11760 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d  = pTab->iDb;.  }
11770 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
11780 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
11790 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
117a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
117b0 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
117c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
117d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
117e0 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
117f0 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
11800 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
11810 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11820 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
11830 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11840 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  IEW.  if( pTab->
11850 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
11860 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11870 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
11880 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
11890 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
118a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
118b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 73 54    }.#endif.  isT
118c0 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d  emp = pTab->iDb=
118d0 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  =1;..  /*.  ** F
118e0 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
118f0 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
11900 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
11910 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
11920 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
11930 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
11940 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
11950 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
11960 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
11970 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
11980 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
11990 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
119a0 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
119b0 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
119c0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
119d0 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
119e0 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
119f0 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
11a00 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
11a10 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
11a20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11a30 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
11a40 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
11a50 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
11a60 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
11a70 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
11a80 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
11a90 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
11aa0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
11ab0 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
11ac0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
11ad0 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
11ae0 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
11af0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
11b00 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
11b10 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
11b20 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
11b30 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
11b40 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
11b50 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
11b60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11b70 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
11b80 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
11b90 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11ba0 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ex;.    if( SQLI
11bb0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
11bc0 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
11bd0 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
11be0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11bf0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11c00 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
11c10 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
11c20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d      Index *pISam
11c30 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f  eName;    /* Ano
11c40 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20  ther index with 
11c50 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f  the same name */
11c60 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
11c70 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
11c80 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
11c90 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
11ca0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
11cb0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
11cc0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
11cd0 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
11ce0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11cf0 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61 6d        if( (pISam
11d00 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
11d10 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
11d20 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
11d30 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20  .zName))!=0 ){. 
11d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11d50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11d60 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
11d70 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
11d80 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
11d90 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11db0 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20  if( (pTSameName 
11dc0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
11dd0 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
11de0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
11df0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11e00 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
11e10 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
11e20 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
11e30 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
11e40 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11e50 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
11e60 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
11e70 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
11e80 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
11e90 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
11ea0 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
11eb0 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
11ec0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
11ed0 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
11ee0 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
11ef0 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "_%d",n);.    zN
11f00 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
11f10 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
11f20 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75  Name, "sqlite_au
11f30 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d  toindex_", pTab-
11f40 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63  >zName, zBuf, (c
11f50 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28  har*)0);.    if(
11f60 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
11f70 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11f80 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ex;.  }..  /* Ch
11f90 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
11fa0 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
11fb0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
11fc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11fd0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11fe0 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
11ff0 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
12000 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
12010 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
12020 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
12030 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
12040 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
12050 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
12060 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
12070 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12080 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
12090 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
120a0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69  INDEX;.    if( i
120b0 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49  sTemp ) i = SQLI
120c0 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
120d0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
120e0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
120f0 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
12100 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
12110 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
12120 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12130 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
12140 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
12150 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
12160 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
12170 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
12180 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
12190 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
121a0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
121b0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
121c0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
121d0 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
121e0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
121f0 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
12200 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
12210 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
12220 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
12230 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
12240 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
12250 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49  n = strlen(nullI
12260 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
12270 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12280 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e  tAppend(0, 0, &n
12290 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
122a0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
122b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
122c0 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
122d0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
122e0 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
122f0 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
12300 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
12310 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
12320 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
12330 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
12340 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
12350 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
12360 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69  f(CollSeq*))*pLi
12370 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69  st->nExpr );.  i
12380 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67  f( pIndex==0 ) g
12390 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
123a0 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d  index;.  pIndex-
123b0 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
123c0 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
123d0 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e  fo.aColl[pList->
123e0 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78  nExpr];.  pIndex
123f0 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
12400 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  )&pIndex->aiColu
12410 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d  mn[pList->nExpr]
12420 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65  ;.  strcpy(pInde
12430 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  x->zName, zName)
12440 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
12450 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
12460 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
12470 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
12480 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
12490 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
124a0 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
124b0 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64  pName==0;.  pInd
124c0 65 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a  ex->iDb = iDb;..
124d0 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
124e0 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
124f0 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
12500 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
12510 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
12520 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
12530 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
12540 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
12550 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
12560 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
12570 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
12580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
12590 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
125a0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
125b0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
125c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
125d0 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
125e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
125f0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
12600 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
12610 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
12620 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
12630 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12640 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
12650 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
12660 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
12670 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
12680 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  me, pList->a[i].
12690 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
126a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
126b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
126c0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
126d0 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28  [i] = j;.    if(
126e0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
126f0 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
12700 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  rt( pList->a[i].
12710 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a  pExpr->pColl );.
12720 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65        pIndex->ke
12730 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d  yInfo.aColl[i] =
12740 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
12750 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pr->pColl;.    }
12760 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64  else{.      pInd
12770 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
12780 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f  l[i] = pTab->aCo
12790 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].pColl;.    
127a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
127b0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
127c0 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66  oll[i] );.    if
127d0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
127e0 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c   && .        sql
127f0 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
12800 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
12810 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
12820 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ]) .    ){.     
12830 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12840 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12850 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79   }.  pIndex->key
12860 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c  Info.nField = pL
12870 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
12880 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
12890 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
128a0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
128b0 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
128c0 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
128d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
128e0 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
128f0 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
12900 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
12910 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
12920 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
12930 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
12940 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
12950 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
12960 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
12970 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
12980 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
12990 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
129a0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
129b0 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
129c0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
129d0 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
129e0 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
129f0 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
12a00 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
12a10 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
12a20 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
12a30 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
12a40 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
12a50 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
12a60 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
12a70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
12a80 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
12a90 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
12aa0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
12ab0 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
12ac0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
12ad0 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
12ae0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
12af0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
12b00 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
12b10 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
12b20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
12b30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
12b40 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
12b50 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  one );.      ass
12b60 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49  ert( pIdx->autoI
12b70 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73  ndex );.      as
12b80 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e  sert( pIndex->on
12b90 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
12ba0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
12bb0 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64  x->nColumn!=pInd
12bc0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f  ex->nColumn ) co
12bd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
12be0 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
12bf0 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20  Column; k++){.  
12c00 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12c10 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
12c20 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
12c30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12c40 20 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49    if( pIdx->keyI
12c50 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49  nfo.aColl[k]!=pI
12c60 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
12c70 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  oll[k] ) break;.
12c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12c90 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
12ca0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
12cb0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
12cc0 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
12cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
12ce0 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
12cf0 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
12d00 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
12d10 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
12d20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
12d30 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
12d40 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
12d50 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
12d60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
12d70 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
12d80 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
12d90 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
12da0 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
12db0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
12dc0 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
12dd0 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
12de0 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
12df0 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
12e00 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
12e10 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
12e20 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
12e30 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
12e40 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
12e50 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
12e60 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
12e70 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
12e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
12e90 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
12ea0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
12eb0 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
12ec0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
12ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
12ee0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12ef0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
12f00 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
12f10 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
12f20 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
12f30 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
12f40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
12f50 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
12f60 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
12f70 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
12f80 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
12f90 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
12fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12fb0 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
12fc0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12fd0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
12fe0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
12ff0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
13000 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
13010 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
13020 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
13030 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
13040 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
13050 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
13060 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
13070 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
13080 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
13090 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
130a0 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20  iDb].idxHash, . 
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
130d0 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
130e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  ndex->zName)+1, 
130f0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
13100 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
13110 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
13120 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
13130 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
13140 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13150 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13160 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
13170 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
13180 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
13190 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
131a0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
131b0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
131c0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
131d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
131e0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
131f0 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
13200 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
13210 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
13220 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
13230 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
13240 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
13250 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
13260 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
13270 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
13280 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
13290 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
132a0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
132b0 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
132c0 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
132d0 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
132e0 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
132f0 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
13300 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
13310 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
13320 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
13330 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
13340 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
13350 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
13360 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
13370 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
13380 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
13390 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
133a0 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
133b0 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
133c0 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
133d0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
133e0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
133f0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
13400 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
13410 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
13420 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
13430 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
13440 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
13450 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
13460 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
13470 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
13480 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
13490 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
134a0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
134b0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
134c0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
134d0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
134e0 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
134f0 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
13500 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
13510 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a  Parse->nMem++;..
13520 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
13530 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13540 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
13550 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13560 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43  index;..    /* C
13570 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
13580 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
13590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
135a0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
135b0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
135c0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
135d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
135e0 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
135f0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
13600 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13610 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
13620 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  em, 0);..    /* 
13630 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
13640 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
13650 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13660 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
13670 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
13680 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
13690 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70   if( pStart && p
136a0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  End ){.      /* 
136b0 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
136c0 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
136d0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
136e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
136f0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
13700 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73 20  rintf("CREATE%s 
13710 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20  INDEX %.*s",.   
13720 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
13730 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
13740 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20  NIQUE",.        
13750 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
13760 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b  Addr(pName->z) +
13770 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
13780 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
13790 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
137a0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
137b0 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
137c0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
137d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
137e0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
137f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
13800 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
13810 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
13820 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
13830 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
13840 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
13850 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
13860 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13870 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
13880 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
13890 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
138a0 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29  ex',%Q,%Q,#0,%Q)
138b0 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
138c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
138d0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
138e0 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
138f0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
13900 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
13910 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
13920 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
13930 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
13940 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
13950 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
13960 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
13970 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
13980 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
13990 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
139a0 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
139b0 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
139c0 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
139d0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
139e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
139f0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
13a00 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
13a10 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
13a20 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
13a30 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
13a40 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
13a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13a60 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
13a70 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
13a80 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
13a90 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27  3MPrintf("name='
13aa0 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
13ab0 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
13ac0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13ad0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13ae0 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20  Expire, 0, 0);. 
13af0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
13b00 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
13b10 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
13b20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
13b30 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
13b40 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
13b50 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
13b60 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
13b70 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
13b80 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
13b90 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
13ba0 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
13bb0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
13bc0 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
13bd0 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
13be0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
13bf0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
13c00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
13c10 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
13c20 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
13c30 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
13c40 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
13c50 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
13c60 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
13c70 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
13c80 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
13c90 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
13ca0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
13cb0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
13cc0 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
13cd0 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
13ce0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
13cf0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
13d00 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
13d10 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
13d20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
13d30 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
13d40 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
13d50 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
13d60 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
13d70 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
13d80 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
13d90 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
13da0 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
13db0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
13dc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13dd0 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
13de0 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
13df0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
13e00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
13e10 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
13e20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
13e30 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
13e40 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
13e50 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
13e60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13e70 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
13e80 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
13e90 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
13ea0 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
13eb0 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
13ec0 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
13ed0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
13ee0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
13ef0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
13f00 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
13f10 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
13f20 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
13f30 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
13f40 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13f50 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
13f60 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
13f70 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
13f80 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
13f90 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
13fa0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
13fb0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 72 65  ema(pParse) ) re
13fc0 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d  turn;.  pIndex =
13fd0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
13fe0 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
13ff0 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
14000 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
14010 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
14020 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14030 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14040 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
14050 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
14060 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
14070 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
14080 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14090 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
140a0 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
140b0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
140c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
140d0 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
140e0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
140f0 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
14100 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
14110 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
14120 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
14130 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
14140 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
14150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14160 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
14170 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
14180 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
14190 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
141a0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
141b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
141c0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
141d0 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e  [pIndex->iDb].zN
141e0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
141f0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
14200 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d  MA_TABLE(pIndex-
14210 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  >iDb);.    if( s
14220 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14230 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
14240 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
14250 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
14260 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
14270 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
14280 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20  ( pIndex->iDb ) 
14290 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
142a0 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
142b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
142c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
142d0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
142e0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
142f0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
14300 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14310 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
14320 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
14330 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
14340 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
14350 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
14360 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
14370 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
14380 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
14390 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  v ){.    int iDb
143a0 20 3d 20 70 49 6e 64 65 78 2d 3e 69 44 62 3b 0a   = pIndex->iDb;.
143b0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
143c0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
143d0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
143e0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
143f0 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
14400 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
14410 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
14420 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49  (iDb),.       pI
14430 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
14440 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
14450 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
14460 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
14470 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
14480 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
14490 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
144a0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
144b0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
144c0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
144d0 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
144e0 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
144f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
14500 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
14510 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
14520 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
14530 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
14540 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
14550 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
14560 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
14570 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
14580 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
14590 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
145a0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
145b0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
145c0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
145d0 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
145e0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
145f0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
14600 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
14610 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
14620 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14630 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
14640 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
14650 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
14660 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  Id>=pList->nAllo
14670 63 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  c ){.    struct 
14680 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  IdList_item *a;.
14690 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
146a0 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
146b0 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d  c*2 + 5;.    a =
146c0 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
146d0 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
146e0 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c  nAlloc*sizeof(pL
146f0 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
14700 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
14710 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
14720 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
14730 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
14740 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
14750 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65  >a = a;.  }.  me
14760 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
14770 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
14780 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
14790 5d 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  ]));.  pList->a[
147a0 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
147b0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
147c0 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
147d0 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b  ;.  pList->nId++
147e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
147f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
14800 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
14810 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
14820 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
14830 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
14840 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
14850 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
14860 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
14870 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
14880 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
14890 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
148a0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
148b0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
148c0 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
148d0 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
148e0 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
148f0 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
14900 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
14910 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
14920 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
14930 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
14940 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
14950 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
14960 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
14970 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
14980 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
14990 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
149a0 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
149b0 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
149c0 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
149d0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
149e0 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
149f0 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
14a00 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
14a10 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
14a20 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
14a30 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
14a40 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
14a50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
14a60 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
14a70 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
14a80 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
14a90 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
14aa0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
14ab0 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
14ac0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
14ad0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
14ae0 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
14af0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
14b00 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
14b10 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
14b20 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
14b30 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
14b40 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
14b50 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
14b60 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
14b70 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
14b80 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
14b90 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
14ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
14bb0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
14bc0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
14bd0 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
14be0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
14bf0 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
14c00 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53  ase){.  struct S
14c10 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
14c20 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
14c30 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
14c40 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
14c50 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
14c60 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
14c70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14c80 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
14c90 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
14ca0 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
14cb0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
14cc0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
14cd0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
14ce0 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
14cf0 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
14d00 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
14d10 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
14d20 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
14d30 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
14d40 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
14d50 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
14d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
14d70 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
14d80 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
14d90 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
14da0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
14db0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
14dc0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
14dd0 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
14de0 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
14df0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
14e00 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
14e10 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
14e20 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
14e30 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
14e40 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
14e50 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
14e60 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
14e70 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
14e80 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
14e90 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
14ea0 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
14eb0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
14ec0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
14ed0 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
14ee0 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
14ef0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
14f00 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70  (pDatabase);.  p
14f10 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
14f20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72  -1;.  pList->nSr
14f30 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
14f40 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
14f50 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20  sign cursors to 
14f60 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
14f70 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
14f80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
14f90 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
14fa0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
14fb0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
14fc0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
14fd0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14fe0 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  m;.  for(i=0, pI
14ff0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
15000 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
15010 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
15020 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
15030 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
15040 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
15050 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
15060 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ++;.    if( pIte
15070 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
15080 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
15090 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
150a0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
150b0 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
150c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
150d0 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
150e0 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
150f0 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
15100 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
15110 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
15120 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69  te3SrcListAddAli
15130 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
15140 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
15150 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
15160 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
15170 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
15180 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a  pList->nSrc-1].z
15190 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
151a0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
151b0 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ken);.  }.}../*.
151c0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
151d0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
151e0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
151f0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  (IdList *pList){
15200 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
15210 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
15220 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
15230 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
15240 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
15250 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
15260 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
15270 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
15280 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
15290 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
152a0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
152b0 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
152c0 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
152d0 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
152e0 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
152f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15300 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
15310 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
15320 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
15330 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
15340 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
15350 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
15360 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
15370 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
15380 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
15390 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
153a0 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
153b0 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
153c0 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  -1;.}../*.** Del
153d0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
153e0 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
153f0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
15400 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
15410 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
15420 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  te(SrcList *pLis
15430 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
15440 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
15450 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
15460 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
15470 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
15480 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
15490 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
154a0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
154b0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
154c0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
154d0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
154e0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
154f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
15500 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
15510 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
15520 26 26 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  && pItem->pTab->
15530 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
15540 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
15550 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d  teTable(0, pItem
15560 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->pTab);.    }. 
15570 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15580 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53  Delete(pItem->pS
15590 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
155a0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49  te3ExprDelete(pI
155b0 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
155c0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
155d0 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  te(pItem->pUsing
155e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
155f0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
15600 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
15610 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
15620 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
15630 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
15640 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
15650 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15660 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
15670 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61  nt i;..  if( pPa
15680 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
15690 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
156a0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
156b0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
156c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
156d0 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
156e0 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
156f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
15700 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15710 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
15720 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
15730 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
15740 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15750 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15760 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
15770 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
15780 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
15790 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
157a0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
157b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
157c0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
157d0 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
157e0 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
157f0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
15800 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15810 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
15820 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
15830 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
15840 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
15850 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
15860 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
15870 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
15880 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
15890 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
158a0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
158b0 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
158c0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
158d0 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
158e0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
158f0 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
15900 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15910 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15920 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15930 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f  TRANSACTION, "CO
15940 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72  MMIT", 0, 0) ) r
15950 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
15960 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15970 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
15980 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15990 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
159a0 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20  Commit, 1, 0);. 
159b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c   }.}../*.** Roll
159c0 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
159d0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
159e0 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61  e3RollbackTransa
159f0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
15a00 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
15a10 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
15a20 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
15a30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
15a40 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
15a50 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
15a60 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
15a70 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
15a80 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
15a90 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
15aa0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
15ab0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
15ac0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
15ad0 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
15ae0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
15af0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15b00 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15b10 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15b20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15b30 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
15b40 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15b50 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
15b60 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
15b70 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
15b80 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
15b90 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
15ba0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
15bb0 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
15bc0 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
15bd0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
15be0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
15bf0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
15c00 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
15c10 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
15c20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15c30 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
15c40 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
15c50 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
15c60 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
15c70 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
15c80 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50  (db, 0, 0, MAX_P
15c90 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31  AGES, &db->aDb[1
15ca0 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
15cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15cd0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15ce0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
15cf0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
15d00 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
15d10 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
15d20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
15d30 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
15d40 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
15d50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
15d60 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
15d70 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f  gs & !db->autoCo
15d80 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  mmit ){.      rc
15d90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
15da0 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44  eginTrans(db->aD
15db0 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20  b[1].pBt, 1);.  
15dc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15de0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15df0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
15e00 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
15e10 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
15e20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
15e30 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
15e40 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ");.        pPar
15e50 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
15e60 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15e80 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
15e90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
15ea0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
15eb0 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
15ec0 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20  hema cookie and 
15ed0 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d  start.** a read-
15ee0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
15ef0 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61  all named databa
15f00 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  se files..**.** 
15f10 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
15f20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20  that all schema 
15f30 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66  cookies be verif
15f40 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72  ied and all.** r
15f50 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ead transactions
15f60 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
15f70 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  re anything else
15f80 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74   happens in.** t
15f90 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
15fa0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
15fb0 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
15fc0 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65   after much othe
15fd0 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65  r.** code has be
15fe0 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53  en generated.  S
15ff0 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77  o here is what w
16000 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e do:.**.** The 
16010 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
16020 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
16030 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50  d, we code an OP
16040 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69  _Goto that.** wi
16050 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62  ll jump to a sub
16060 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65  routine at the e
16070 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  nd of the progra
16080 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72  m.  Then we.** r
16090 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61  ecord every data
160a0 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20  base that needs 
160b0 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66  its schema verif
160c0 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50  ied in the.** pP
160d0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
160e0 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20   field.  Later, 
160f0 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20  after all other 
16100 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a  code has been.**
16110 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20   generated, the 
16120 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
16130 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  does the cookie 
16140 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e  verifications an
16150 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20  d.** starts the 
16160 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c  transactions wil
16170 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74  l be coded and t
16180 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61  he OP_Goto P2 va
16190 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d  lue.** will be m
161a0 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
161b0 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  that subroutine.
161c0 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e    The generation
161d0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69   of the.** cooki
161e0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73  e verification s
161f0 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68  ubroutine code h
16200 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65  appens in sqlite
16210 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
16220 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20  .**.** If iDb<0 
16230 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50  then code the OP
16240 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e  _Goto only - don
16250 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76  't set flag to v
16260 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68  erify the.** sch
16270 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62  ema on any datab
16280 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ases.  This can 
16290 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  be used to posit
162a0 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a  ion the OP_Goto.
162b0 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20  ** early in the 
162c0 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20  code, before we 
162d0 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61  know if any data
162e0 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c  base tables will
162f0 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   be used..*/.voi
16300 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
16310 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
16320 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
16330 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16340 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
16350 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20  nt mask;..  v = 
16360 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16370 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
16380 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
16390 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
163a0 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
163b0 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
163c0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
163d0 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
163e0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
163f0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  ){.    pParse->c
16400 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69  ookieGoto = sqli
16410 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16420 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
16430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
16440 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
16450 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
16460 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
16470 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
16480 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
16490 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32    assert( iDb<32
164a0 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31   );.    mask = 1
164b0 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
164c0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
164d0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
164e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
164f0 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  ookieMask |= mas
16500 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  k;.      pParse-
16510 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
16520 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
16530 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  .schema_cookie;.
16540 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
16550 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16560 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
16570 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ase(pParse);.   
16580 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
16590 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
165a0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
165b0 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
165c0 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
165d0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
165e0 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
165f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
16600 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
16610 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
16620 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
16630 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
16640 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
16650 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
16660 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
16670 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
16680 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
16690 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
166a0 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
166b0 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
166c0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
166d0 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
166e0 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
166f0 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
16700 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
16710 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
16720 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
16730 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
16740 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
16750 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
16760 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
16770 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
16780 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
16790 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
167a0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
167b0 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
167c0 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
167d0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
167e0 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
167f0 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
16800 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
16810 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
16820 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
16830 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  t be set..**.** 
16840 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44  Only database iD
16850 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  b and the temp d
16860 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
16870 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69   writable by thi
16880 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44  s call..** If iD
16890 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d  b==0, then the m
168a0 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74  ain and temp dat
168b0 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20  abases are made 
168c0 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a  writable.   If.*
168d0 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e  * iDb==1 then on
168e0 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ly the temp data
168f0 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69  base is made wri
16900 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31  table.  If iDb>1
16910 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65   then the.** spe
16920 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79  cified auxiliary
16930 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
16940 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
16950 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
16960 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
16970 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
16980 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
16990 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
169a0 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
169b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
169c0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
169d0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
169e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
169f0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
16a00 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
16a10 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74  ;.  pParse->writ
16a20 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b  eMask |= 1<<iDb;
16a30 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d  .  if( setStatem
16a40 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ent && pParse->n
16a50 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
16a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  (v, OP_Statement
16a80 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20  , iDb, 0);.  }. 
16a90 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 70   if( iDb!=1 && p
16aa0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
16ab0 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20  ].pBt!=0 ){.    
16ac0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
16ad0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
16ae0 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  e, setStatement,
16af0 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   1);.  }.}..#ifn
16b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16b10 55 54 46 31 36 0a 2f 2a 20 0a 2a 2a 20 52 65 74  UTF16./* .** Ret
16b20 75 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e  urn the transien
16b30 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t sqlite3_value 
16b40 6f 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20  object used for 
16b50 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73  encoding convers
16b60 69 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53  ions.** during S
16b70 51 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a  QL compilation..
16b80 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
16b90 20 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e   *sqlite3GetTran
16ba0 73 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74  sientValue(sqlit
16bb0 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21  e3 *db){.  if( !
16bc0 64 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20  db->pValue ){.  
16bd0 20 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73    db->pValue = s
16be0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
16bf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
16c00 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 23 65 6e  b->pValue;.}.#en
16c10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
16c20 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
16c30 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
16c40 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
16c50 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
16c60 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
16c70 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
16c80 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
16c90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16ca0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
16cb0 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
16cc0 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  ch(CollSeq *pCol
16cd0 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
16ce0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 6e  ){.  int n = pIn
16cf0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
16d00 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  eld;.  CollSeq *
16d10 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65  *pp = pIndex->ke
16d20 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77  yInfo.aColl;.  w
16d30 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20  hile( n-- ){.   
16d40 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20   if( *pp==pColl 
16d50 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
16d60 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pp++;.  }.  retu
16d70 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
16d80 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
16d90 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
16da0 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
16db0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
16dc0 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
16dd0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
16de0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
16df0 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
16e00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16e10 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
16e20 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
16e30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
16e40 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c 53  ble *pTab, CollS
16e50 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e  eq *pColl){.  In
16e60 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
16e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16e80 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16e90 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
16ea0 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
16eb0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
16ec0 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
16ed0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
16ee0 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   pColl==0 || col
16ef0 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f 6c  lationMatch(pCol
16f00 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  l,pIndex) ){.   
16f10 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
16f20 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
16f30 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69  arse, 0, pTab->i
16f40 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
16f50 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
16f60 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
16f70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
16f80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
16f90 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
16fa0 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
16fb0 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
16fc0 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
16fd0 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
16fe0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
16ff0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
17000 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
17010 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
17020 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
17030 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17040 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
17050 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
17060 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
17070 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
17080 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
170b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
170c0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
170d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
170e0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
170f0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
17100 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17110 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
17120 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17130 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
17140 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
17150 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
17160 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
17170 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
17180 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
17190 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
171a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
171b0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
171c0 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
171d0 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
171e0 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69  +, pDb++){.    i
171f0 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74  f( pDb==0 ) cont
17200 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
17210 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
17220 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29  t(&pDb->tblHash)
17230 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
17240 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
17250 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
17260 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
17270 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
17280 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
17290 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, pColl);.   
172a0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
172b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
172c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
172d0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
172e0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
172f0 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
17310 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
17320 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
17330 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
17340 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
17350 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
17360 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
17370 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
17380 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
17390 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
173a0 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
173b0 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
173c0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
173d0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
173e0 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
173f0 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
17400 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
17410 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
17420 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
17430 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
17440 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
17450 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
17460 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
17470 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
17480 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
17490 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
174a0 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
174b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
174c0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
174d0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
174e0 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
174f0 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
17500 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
17510 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
17520 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
17530 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
17540 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
17550 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
17560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17570 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17580 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
17590 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
175a0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
175b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
175c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
175d0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
175e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
175f0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
17600 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
17610 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
17620 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
17630 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
17640 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
17650 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
17660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17670 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
17680 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
17690 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
176a0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
176b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
176c0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
176d0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
176e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
176f0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
17700 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
17710 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
17720 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
17730 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
17740 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
17750 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
17760 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
17770 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
17780 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
17790 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
177a0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
177b0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
177c0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
177d0 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61  pName1==0 || pNa
177e0 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me1->z==0 ){.   
177f0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
17800 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
17810 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
17820 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20  e if( pName2==0 
17830 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
17840 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
17850 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
17860 71 28 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70  q(db, db->enc, p
17870 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31  Name1->z, pName1
17880 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
17890 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
178a0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
178b0 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b  (pParse, pColl);
178c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
178d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d     }.  }.  iDb =
178e0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
178f0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
17900 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
17910 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
17920 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
17930 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
17940 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d  romToken(pObjNam
17950 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  e);.  zDb = db->
17960 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
17970 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
17980 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
17990 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
179a0 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
179b0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
179c0 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
179d0 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72  teFree(z);.    r
179e0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
179f0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
17a00 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
17a10 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
17a20 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  (z);.  if( pInde
17a30 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
17a40 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
17a50 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
17a60 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
17a70 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
17a80 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
17a90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
17aa0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
17ab0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
17ac0 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
17ad0 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
17ae0 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
17af0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
17b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
17b10 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  TABLE./*.** Gene
17b20 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70  rate code to imp
17b30 6c 65 6d 65 6e 74 20 74 68 65 20 22 41 4c 54 45  lement the "ALTE
17b40 52 20 54 41 42 4c 45 20 78 78 78 20 52 45 4e 41  R TABLE xxx RENA
17b50 4d 45 20 54 4f 20 79 79 79 22 20 0a 2a 2a 20 63  ME TO yyy" .** c
17b60 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 76 6f 69 64  ommand. .*/.void
17b70 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65 6e   sqlite3AlterRen
17b80 61 6d 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  ameTable(.  Pars
17b90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17ba0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
17bb0 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 72  context. */.  Sr
17bc0 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
17bd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
17be0 61 62 6c 65 20 74 6f 20 72 65 6e 61 6d 65 2e 20  able to rename. 
17bf0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
17c00 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e              /
17c10 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
17c20 6e 61 6d 65 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  name. */.){.  in
17c30 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
17c40 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
17c50 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
17c60 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
17c70 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
17c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
17c90 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 69  me of database i
17ca0 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
17cb0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
17cc0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
17cd0 20 72 65 6e 61 6d 65 64 20 2a 2f 0a 20 20 63 68   renamed */.  ch
17ce0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
17cf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 2d          /* NULL-
17d00 74 65 72 6d 69 6e 61 74 65 64 20 76 65 72 73 69  terminated versi
17d10 6f 6e 20 6f 66 20 70 4e 61 6d 65 20 2a 2f 20 0a  on of pName */ .
17d20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
17d30 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57   0;         /* W
17d40 68 65 72 65 20 63 6c 61 75 73 65 20 6f 66 20 73  here clause of s
17d50 63 68 65 6d 61 20 65 6c 65 6d 65 6e 74 73 20 74  chema elements t
17d60 6f 20 72 65 70 61 72 73 65 20 2a 2f 0a 20 20 73  o reparse */.  s
17d70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
17d80 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 44 61 74 61  rse->db; /* Data
17d90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17da0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 0a 23 69  */.  Vdbe *v;.#i
17db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17dc0 54 5f 54 52 49 47 47 45 52 0a 20 20 63 68 61 72  T_TRIGGER.  char
17dd0 20 2a 7a 54 65 6d 70 54 72 69 67 20 3d 20 30 3b   *zTempTrig = 0;
17de0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 63        /* Where c
17df0 6c 61 75 73 65 20 74 6f 20 6c 6f 63 61 74 65 20  lause to locate 
17e00 74 65 6d 70 20 74 72 69 67 67 65 72 73 20 2a 2f  temp triggers */
17e10 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73  .#endif.  .  ass
17e20 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3d  ert( pSrc->nSrc=
17e30 3d 31 20 29 3b 0a 0a 20 20 70 54 61 62 20 3d 20  =1 );..  pTab = 
17e40 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
17e50 6c 65 28 70 50 61 72 73 65 2c 20 70 53 72 63 2d  le(pParse, pSrc-
17e60 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 53 72  >a[0].zName, pSr
17e70 63 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  c->a[0].zDatabas
17e80 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20  e);.  if( !pTab 
17e90 29 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65  ) goto exit_alte
17ea0 72 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d  r_table;.  iDb =
17eb0 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7a 44   pTab->iDb;.  zD
17ec0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
17ed0 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 47 65  .zName;..  /* Ge
17ee0 74 20 61 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61  t a NULL termina
17ef0 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
17f00 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
17f10 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  e. */.  zName = 
17f20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17f30 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
17f40 66 28 20 21 7a 4e 61 6d 65 20 29 20 67 6f 74 6f  f( !zName ) goto
17f50 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c   exit_alter_tabl
17f60 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
17f70 68 61 74 20 61 20 74 61 62 6c 65 20 6f 72 20 69  hat a table or i
17f80 6e 64 65 78 20 6e 61 6d 65 64 20 27 7a 4e 61 6d  ndex named 'zNam
17f90 65 27 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  e' does not alre
17fa0 61 64 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 69  ady exist.  ** i
17fb0 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
17fc0 49 66 20 73 6f 2c 20 74 68 69 73 20 69 73 20 61  If so, this is a
17fd0 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
17fe0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
17ff0 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
18000 7a 44 62 29 20 7c 7c 20 73 71 6c 69 74 65 33 46  zDb) || sqlite3F
18010 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
18020 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
18030 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18040 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
18050 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
18060 64 79 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  dy another table
18070 20 6f 72 20 69 6e 64 65 78 20 77 69 74 68 20 74   or index with t
18080 68 69 73 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  his name: %s", z
18090 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
180a0 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65  exit_alter_table
180b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
180c0 20 73 75 72 65 20 69 74 20 69 73 20 6e 6f 74 20   sure it is not 
180d0 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 62  a system table b
180e0 65 69 6e 67 20 61 6c 74 65 72 65 64 2c 20 6f 72  eing altered, or
180f0 20 61 20 72 65 73 65 72 76 65 64 20 6e 61 6d 65   a reserved name
18100 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 74  .  ** that the t
18110 61 62 6c 65 20 69 73 20 62 65 69 6e 67 20 72 65  able is being re
18120 6e 61 6d 65 64 20 74 6f 2e 0a 20 20 2a 2f 0a 20  named to..  */. 
18130 20 69 66 28 20 73 74 72 6c 65 6e 28 70 54 61 62   if( strlen(pTab
18140 2d 3e 7a 4e 61 6d 65 29 3e 36 20 26 26 20 30 3d  ->zName)>6 && 0=
18150 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
18160 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
18170 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
18180 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18190 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
181a0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
181b0 61 6c 74 65 72 65 64 22 2c 20 70 54 61 62 2d 3e  altered", pTab->
181c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
181d0 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c   exit_alter_tabl
181e0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  e;.  }.  if( SQL
181f0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
18200 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
18210 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
18220 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 61  .    goto exit_a
18230 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  lter_table;.  }.
18240 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18250 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
18260 4f 4e 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ON.  /* Invoke t
18270 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
18280 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20   callback. */.  
18290 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
182a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
182b0 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 2c  ITE_ALTER_TABLE,
182c0 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   zDb, pTab->zNam
182d0 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  e, 0) ){.    got
182e0 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62  o exit_alter_tab
182f0 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
18300 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74 72 61    /* Begin a tra
18310 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 63 6f 64  nsaction and cod
18320 65 20 74 68 65 20 56 65 72 69 66 79 43 6f 6f 6b  e the VerifyCook
18330 69 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ie for database 
18340 69 44 62 2e 20 0a 20 20 2a 2a 20 54 68 65 6e 20  iDb. .  ** Then 
18350 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65 6d  modify the schem
18360 61 20 63 6f 6f 6b 69 65 20 28 73 69 6e 63 65 20  a cookie (since 
18370 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20  the ALTER TABLE 
18380 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20 2a  modifies the.  *
18390 2a 20 73 63 68 65 6d 61 29 2e 0a 20 20 2a 2f 0a  * schema)..  */.
183a0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
183b0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
183c0 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
183d0 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f  goto exit_alter_
183e0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  table;.  }.  sql
183f0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
18400 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
18410 30 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  0, iDb);.  sqlit
18420 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
18430 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 20 20 2f  b, v, iDb);..  /
18440 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  * Modify the sql
18450 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
18460 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20   to use the new 
18470 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20  table name. */. 
18480 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
18490 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
184a0 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
184b0 53 45 54 20 22 0a 23 69 66 64 65 66 20 53 51 4c  SET ".#ifdef SQL
184c0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
184d0 0a 20 20 20 20 20 20 20 20 20 20 22 73 71 6c 20  .          "sql 
184e0 3d 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74  = sqlite_alter_t
184f0 61 62 6c 65 28 73 71 6c 2c 20 25 51 29 2c 20 22  able(sql, %Q), "
18500 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
18510 20 22 73 71 6c 20 3d 20 43 41 53 45 20 22 0a 20   "sql = CASE ". 
18520 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45 4e             "WHEN
18530 20 74 79 70 65 20 3d 20 27 74 72 69 67 67 65 72   type = 'trigger
18540 27 20 54 48 45 4e 20 73 71 6c 69 74 65 5f 61 6c  ' THEN sqlite_al
18550 74 65 72 5f 74 72 69 67 67 65 72 28 73 71 6c 2c  ter_trigger(sql,
18560 20 25 51 29 22 0a 20 20 20 20 20 20 20 20 20 20   %Q)".          
18570 20 20 22 45 4c 53 45 20 73 71 6c 69 74 65 5f 61    "ELSE sqlite_a
18580 6c 74 65 72 5f 74 61 62 6c 65 28 73 71 6c 2c 20  lter_table(sql, 
18590 25 51 29 20 45 4e 44 2c 20 22 0a 23 65 6e 64 69  %Q) END, ".#endi
185a0 66 0a 20 20 20 20 20 20 20 20 20 20 22 74 62 6c  f.          "tbl
185b0 5f 6e 61 6d 65 20 3d 20 25 51 2c 20 22 0a 20 20  _name = %Q, ".  
185c0 20 20 20 20 20 20 20 20 22 6e 61 6d 65 20 3d 20          "name = 
185d0 43 41 53 45 20 22 0a 20 20 20 20 20 20 20 20 20  CASE ".         
185e0 20 20 20 22 57 48 45 4e 20 74 79 70 65 3d 27 74     "WHEN type='t
185f0 61 62 6c 65 27 20 54 48 45 4e 20 25 51 20 22 0a  able' THEN %Q ".
18600 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45              "WHE
18610 4e 20 6e 61 6d 65 20 4c 49 4b 45 20 27 73 71 6c  N name LIKE 'sql
18620 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 25 25 27  ite_autoindex%%'
18630 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
18640 27 20 54 48 45 4e 20 22 0a 20 20 20 20 20 20 20  ' THEN ".       
18650 20 20 20 20 20 20 20 22 27 73 71 6c 69 74 65 5f         "'sqlite_
18660 61 75 74 6f 69 6e 64 65 78 5f 27 20 7c 7c 20 25  autoindex_' || %
18670 51 20 7c 7c 20 73 75 62 73 74 72 28 6e 61 6d 65  Q || substr(name
18680 2c 20 25 64 2b 31 38 2c 31 30 29 20 22 0a 20 20  , %d+18,10) ".  
18690 20 20 20 20 20 20 20 20 20 20 22 45 4c 53 45 20            "ELSE 
186a0 6e 61 6d 65 20 45 4e 44 20 22 0a 20 20 20 20 20  name END ".     
186b0 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65   "WHERE tbl_name
186c0 3d 25 51 20 41 4e 44 20 22 0a 20 20 20 20 20 20  =%Q AND ".      
186d0 20 20 20 20 22 28 74 79 70 65 3d 27 74 61 62 6c      "(type='tabl
186e0 65 27 20 4f 52 20 74 79 70 65 3d 27 69 6e 64 65  e' OR type='inde
186f0 78 27 20 4f 52 20 74 79 70 65 3d 27 74 72 69 67  x' OR type='trig
18700 67 65 72 27 29 3b 22 2c 20 0a 20 20 20 20 20 20  ger');", .      
18710 7a 44 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  zDb, SCHEMA_TABL
18720 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c 20 7a  E(iDb), zName, z
18730 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 0a 23 69  Name, zName, .#i
18740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18750 54 5f 54 52 49 47 47 45 52 0a 7a 4e 61 6d 65 2c  T_TRIGGER.zName,
18760 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7a 4e  .#endif.      zN
18770 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 54 61 62  ame, strlen(pTab
18780 2d 3e 7a 4e 61 6d 65 29 2c 20 70 54 61 62 2d 3e  ->zName), pTab->
18790 7a 4e 61 6d 65 0a 20 20 29 3b 0a 0a 23 69 66 6e  zName.  );..#ifn
187a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
187b0 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
187c0 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65  /* If the sqlite
187d0 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
187e0 65 78 69 73 74 73 20 69 6e 20 74 68 69 73 20 64  exists in this d
187f0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 75 70  atabase, then up
18800 64 61 74 65 20 0a 20 20 2a 2a 20 69 74 20 77 69  date .  ** it wi
18810 74 68 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  th the new table
18820 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
18830 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
18840 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
18850 65 71 75 65 6e 63 65 22 2c 20 7a 44 62 29 20 29  equence", zDb) )
18860 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
18870 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
18880 0a 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45  .        "UPDATE
18890 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
188a0 6e 63 65 20 73 65 74 20 6e 61 6d 65 20 3d 20 25  nce set name = %
188b0 51 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 25  Q WHERE name = %
188c0 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 2c  Q",.        zDb,
188d0 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
188e0 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
188f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18900 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
18910 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
18920 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f 6e  TEMP triggers on
18930 20 74 68 69 73 20 74 61 62 6c 65 2c 20 6d 6f 64   this table, mod
18940 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 74  ify the sqlite_t
18950 65 6d 70 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  emp_master.  ** 
18960 74 61 62 6c 65 2e 20 44 6f 6e 27 74 20 64 6f 20  table. Don't do 
18970 74 68 69 73 20 69 66 20 74 68 65 20 74 61 62 6c  this if the tabl
18980 65 20 62 65 69 6e 67 20 41 4c 54 45 52 65 64 20  e being ALTERed 
18990 69 73 20 69 74 73 65 6c 66 20 6c 6f 63 61 74 65  is itself locate
189a0 64 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 74 65  d in.  ** the te
189b0 6d 70 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  mp database..  *
189c0 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
189d0 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
189e0 54 72 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  Trig;.    char *
189f0 74 6d 70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  tmp = 0;.    for
18a00 28 20 70 54 72 69 67 3d 70 54 61 62 2d 3e 70 54  ( pTrig=pTab->pT
18a10 72 69 67 67 65 72 3b 20 70 54 72 69 67 3b 20 70  rigger; pTrig; p
18a20 54 72 69 67 3d 70 54 72 69 67 2d 3e 70 4e 65 78  Trig=pTrig->pNex
18a30 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
18a40 54 72 69 67 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a  Trig->iDb==1 ){.
18a50 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 54 65          if( !zTe
18a60 6d 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20  mpTrig ){.      
18a70 20 20 20 20 7a 54 65 6d 70 54 72 69 67 20 3d 20      zTempTrig = 
18a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
18a90 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74  qlite3MPrintf("t
18aa0 79 70 65 20 3d 20 27 74 72 69 67 67 65 72 27 20  ype = 'trigger' 
18ab0 41 4e 44 20 28 6e 61 6d 65 3d 25 51 22 2c 20 70  AND (name=%Q", p
18ac0 54 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  Trig->name);.   
18ad0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18ae0 20 20 20 20 20 20 74 6d 70 20 3d 20 7a 54 65 6d        tmp = zTem
18af0 70 54 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20  pTrig;.         
18b00 20 7a 54 65 6d 70 54 72 69 67 20 3d 20 73 71 6c   zTempTrig = sql
18b10 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 20  ite3MPrintf("%s 
18b20 4f 52 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 65  OR name=%Q", zTe
18b30 6d 70 54 72 69 67 2c 20 70 54 72 69 67 2d 3e 6e  mpTrig, pTrig->n
18b40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
18b50 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70 29 3b  sqliteFree(tmp);
18b60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18b70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18b80 20 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a 20 20   zTempTrig ){.  
18b90 20 20 20 20 74 6d 70 20 3d 20 7a 54 65 6d 70 54      tmp = zTempT
18ba0 72 69 67 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  rig;.      zTemp
18bb0 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  Trig = sqlite3MP
18bc0 72 69 6e 74 66 28 22 25 73 29 22 2c 20 7a 54 65  rintf("%s)", zTe
18bd0 6d 70 54 72 69 67 29 3b 0a 20 20 20 20 20 20 73  mpTrig);.      s
18be0 71 6c 69 74 65 46 72 65 65 28 74 6d 70 29 3b 0a  qliteFree(tmp);.
18bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
18c00 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
18c10 20 0a 20 20 20 20 20 20 20 20 20 20 22 55 50 44   .          "UPD
18c20 41 54 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ATE sqlite_temp_
18c30 6d 61 73 74 65 72 20 53 45 54 20 22 0a 20 20 20  master SET ".   
18c40 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c 20             "sql 
18c50 3d 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74  = sqlite_alter_t
18c60 72 69 67 67 65 72 28 73 71 6c 2c 20 25 51 29 2c  rigger(sql, %Q),
18c70 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
18c80 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 20   "tbl_name = %Q 
18c90 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
18ca0 22 57 48 45 52 45 20 25 73 3b 22 2c 20 7a 4e 61  "WHERE %s;", zNa
18cb0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 54 65 6d 70  me, zName, zTemp
18cc0 54 72 69 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Trig);.    }.  }
18cd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
18ce0 6f 70 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  op the elements 
18cf0 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
18d00 20 73 63 68 65 6d 61 20 74 68 61 74 20 72 65 66   schema that ref
18d10 65 72 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ered to the tabl
18d20 65 0a 20 20 2a 2a 20 72 65 6e 61 6d 65 64 20 61  e.  ** renamed a
18d30 6e 64 20 6c 6f 61 64 20 74 68 65 20 6e 65 77 20  nd load the new 
18d40 76 65 72 73 69 6f 6e 73 20 66 72 6f 6d 20 74 68  versions from th
18d50 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
18d60 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
18d70 45 72 72 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  Err==0 ){.#ifnde
18d80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
18d90 49 47 47 45 52 0a 20 20 20 20 54 72 69 67 67 65  IGGER.    Trigge
18da0 72 20 2a 70 54 72 69 67 3b 0a 20 20 20 20 66 6f  r *pTrig;.    fo
18db0 72 28 20 70 54 72 69 67 3d 70 54 61 62 2d 3e 70  r( pTrig=pTab->p
18dc0 54 72 69 67 67 65 72 3b 20 70 54 72 69 67 3b 20  Trigger; pTrig; 
18dd0 70 54 72 69 67 3d 70 54 72 69 67 2d 3e 70 4e 65  pTrig=pTrig->pNe
18de0 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
18df0 72 74 28 20 70 54 72 69 67 2d 3e 69 44 62 3d 3d  rt( pTrig->iDb==
18e00 69 44 62 20 7c 7c 20 70 54 72 69 67 2d 3e 69 44  iDb || pTrig->iD
18e10 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  b==1 );.      sq
18e20 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
18e30 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20  OP_DropTrigger, 
18e40 70 54 72 69 67 2d 3e 69 44 62 2c 20 30 2c 20 70  pTrig->iDb, 0, p
18e50 54 72 69 67 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a  Trig->name, 0);.
18e60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18e70 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
18e80 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
18e90 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a   iDb, 0, pTab->z
18ea0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7a 57  Name, 0);.    zW
18eb0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  here = sqlite3MP
18ec0 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d  rintf("tbl_name=
18ed0 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %Q", zName);.   
18ee0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
18ef0 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
18f00 61 2c 20 69 44 62 2c 20 30 2c 20 7a 57 68 65 72  a, iDb, 0, zWher
18f10 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P3_DYNAMIC);.
18f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18f30 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
18f40 69 66 28 20 7a 54 65 6d 70 54 72 69 67 20 29 7b  if( zTempTrig ){
18f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18f60 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
18f70 65 53 63 68 65 6d 61 2c 20 31 2c 20 30 2c 20 7a  eSchema, 1, 0, z
18f80 54 65 6d 70 54 72 69 67 2c 20 50 33 5f 44 59 4e  TempTrig, P3_DYN
18f90 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
18fa0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
18fb0 46 72 65 65 28 7a 54 65 6d 70 54 72 69 67 29 3b  Free(zTempTrig);
18fc0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 65 78 69  .#endif.  }..exi
18fd0 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3a 0a 20  t_alter_table:. 
18fe0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
18ff0 65 6c 65 74 65 28 70 53 72 63 29 3b 0a 20 20 73  elete(pSrc);.  s
19000 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
19010 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.