/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 27e3cc9e5d5187fa6f23d2e60b76e82c4bc0e7b0:


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 32 37 35 20 32 30 30 34 2f 31 31 2f 31 30  1.275 2004/11/10
02f0: 20 31 31 3a 35 35 3a 31 32 20 64 61 6e 69 65 6c   11:55:12 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 43  ** be parsed.  C
0390: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03a0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03b0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03c0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03d0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
03e0: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
03f0: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0400: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0410: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0420: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0430: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
0440: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
0450: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
0460: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0470: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0480: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
04a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
04b0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
04c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
04d0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
04e0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
04f0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0500: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0510: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0520: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0530: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0540: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0550: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0560: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0570: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0580: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0590: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
05a0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
05b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
05c0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
05d0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
05e0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
05f0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0600: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
0610: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
0620: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
0630: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
0640: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
0650: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
0660: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0670: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0680: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67  eturn;..  /* Beg
0690: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
06a0: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
06b0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
06c0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
06d0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
06e0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
06f0: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0700: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
0710: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
0720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0730: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
0740: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
0750: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
0760: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0770: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0780: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
0790: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
07a0: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
07b0: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
07c0: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
07d0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
07e0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
07f0: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0800: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
0810: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
0820: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
0830: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
0840: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
0850: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
0860: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0870: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0880: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
0890: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
08a0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
08b0: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
08c0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
08d0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
08e0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
08f0: 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  to-1, sqlite3Vdb
0900: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
0910: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
0920: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
0930: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
0940: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
0950: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
0960: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
0970: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
0980: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
0990: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
09a0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
09b0: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
09c0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
09d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
09e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
09f0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
0a00: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
0a10: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
0a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
0a30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0a40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
0a50: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
0a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0a70: 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74  Add a No-op that
0a80: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
0a90: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
0aa0: 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a  he compiled SQL.
0ab0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
0ac0: 20 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d   as its P3 argum
0ad0: 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20  ent.  This does 
0ae0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66  not change the f
0af0: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
0b00: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
0b10: 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  am. .    **.    
0b20: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
0b30: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  to implement sql
0b40: 69 74 65 33 5f 74 72 61 63 65 28 29 20 66 75 6e  ite3_trace() fun
0b50: 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 20 20 20 20  ctionality..    
0b60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
0b70: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70  beOp3(v, OP_Noop
0b80: 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  , 0, 0, pParse->
0b90: 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54  zSql, pParse->zT
0ba0: 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c  ail-pParse->zSql
0bb0: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65  );.  }...  /* Ge
0bc0: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
0bd0: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
0be0: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
0bf0: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
0c00: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  Err==0 ){.    FI
0c10: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0c20: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0c30: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0c40: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0c50: 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63 65  sqlite3VdbeTrace
0c60: 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20  (v, trace);.    
0c70: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
0c80: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
0c90: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
0ca0: 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20  em+3,.          
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70  Parse->nTab+3, p
0cd0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
0ce0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0cf0: 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f  = pParse->nErr ?
0d00: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
0d10: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
0d20: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
0d30: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
0d40: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63  e if( pParse->rc
0d50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
0d60: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
0d70: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
0d80: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
0d90: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0da0: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
0db0: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
0dc0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
0dd0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  ;.  pParse->nVar
0de0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0df0: 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a  cookieMask = 0;.
0e00: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
0e10: 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Goto = 0;.}../*.
0e20: 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65  ** Run the parse
0e30: 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  r and code gener
0e40: 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79  ator recursively
0e50: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e   in order to gen
0e60: 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f  erate.** code fo
0e70: 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  r the SQL statem
0e80: 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74  ent given onto t
0e90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50  he end of the pP
0ea0: 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20  arse context.** 
0eb0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
0ec0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57  construction.  W
0ed0: 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69  hen the parser i
0ee0: 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c  s run recursivel
0ef0: 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74  y.** this way, t
0f00: 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74  he final OP_Halt
0f10: 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64   is not appended
0f20: 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69   and other initi
0f30: 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64  alization.** and
0f40: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74   finalization st
0f50: 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20  eps are omitted 
0f60: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72  because those ar
0f70: 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68  e handling by th
0f80: 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70  e.** outermost p
0f90: 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  arser..**.** Not
0fa0: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e   everything is n
0fb0: 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66  estable.  This f
0fc0: 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67  acility is desig
0fd0: 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a  ned to permit.**
0fe0: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c   INSERT, UPDATE,
0ff0: 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72   and DELETE oper
1000: 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53  ations against S
1010: 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55  QLITE_MASTER.  U
1020: 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f  se.** care if yo
1030: 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20  u decide to try 
1040: 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  to use this rout
1050: 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ine for some oth
1060: 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a  er purposes..*/.
1070: 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74  void sqlite3Nest
1080: 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70  edParse(Parse *p
1090: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
10a0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
10b0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
10c0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
10d0: 69 6e 74 20 72 63 3b 0a 23 20 64 65 66 69 6e 65  int rc;.# define
10e0: 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f   SAVE_SZ  (sizeo
10f0: 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65  f(Parse) - offse
1100: 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29  tof(Parse,nVar))
1110: 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66 5b  .  char saveBuf[
1120: 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28  SAVE_SZ];..  if(
1130: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
1140: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
1150: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
1160: 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69  <10 );  /* Nesti
1170: 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ng should only b
1180: 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70  e of limited dep
1190: 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74  th */.  va_start
11a0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
11b0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56   zSql = sqlite3V
11c0: 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  MPrintf(zFormat,
11d0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
11e0: 70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  p);.  pParse->ne
11f0: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1200: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1210: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1220: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1230: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1240: 56 45 5f 53 5a 29 3b 0a 20 20 72 63 20 3d 20 73  VE_SZ);.  rc = s
1250: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
1260: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29  pParse, zSql, 0)
1270: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
1280: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
1290: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
12a0: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
12b0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
12c0: 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  d--;.}../*.** Lo
12d0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
12e0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
12f0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1300: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1310: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1320: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1330: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1340: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1350: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1360: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1370: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1380: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1390: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
13a0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
13b0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
13c0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
13d0: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
13e0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
13f0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
1400: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1410: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
1420: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
1430: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1440: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
1450: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
1460: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
1470: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
1480: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
1490: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
14a0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
14b0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
14c0: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
14d0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
14e0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
14f0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1500: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1510: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
1520: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
1530: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1540: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61   zName!=0 );.  a
1550: 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1560: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69  s & SQLITE_Initi
1570: 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69  alized) || db->i
1580: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f  nit.busy );.  fo
1590: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
15a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
15b0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
15c0: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
15d0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
15e0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
15f0: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
1600: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
1610: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
1620: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
1630: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
1640: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
1650: 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61 73 68  ->aDb[j].tblHash
1660: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
1670: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69  zName)+1);.    i
1680: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
1690: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
16a0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
16b0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
16c0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
16d0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
16e0: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
16f0: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
1700: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
1710: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1720: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
1730: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
1740: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1750: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
1760: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20   if not found.  
1770: 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a  Also leave an.**
1780: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1790: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
17a0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  g..**.** The dif
17b0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
17c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
17d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17e0: 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
17f0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76  .** routine leav
1800: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
1810: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
1820: 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20  ErrMsg where.** 
1830: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1840: 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  () does not..*/.
1850: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
1860: 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20  cateTable(Parse 
1870: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1880: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
1890: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b  t char *zDbase){
18a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
18b0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
18c0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
18d0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
18e0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
18f0: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
1900: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
1910: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
1920: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
1930: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
1940: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
1950: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1960: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
1970: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
1980: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
1990: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
19a0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
19b0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
19c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19d0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
19e0: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
19f0: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1a00: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1a10: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1a20: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1a30: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1a40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a50: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
1a60: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
1a70: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
1a80: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
1a90: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
1aa0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1ab0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ac0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1ad0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1ae0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1af0: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1b00: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1b10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1b20: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1b30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1b40: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1b50: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1b60: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1b70: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
1b80: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
1b90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
1ba0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1bb0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1bc0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1bd0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1be0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1bf0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1c00: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1c10: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1c20: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1c30: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1c40: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1c50: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
1c60: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
1c70: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1c80: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
1c90: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
1ca0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
1cb0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1cc0: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1cd0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1ce0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1cf0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1d00: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
1d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1d20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1d30: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
1d40: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
1d50: 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1d60: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69  s & SQLITE_Initi
1d70: 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69  alized) || db->i
1d80: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f  nit.busy );.  fo
1d90: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1da0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1db0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1dc0: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1dd0: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1de0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
1df0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1e00: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
1e10: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
1e20: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
1e30: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
1e40: 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68  ->aDb[j].idxHash
1e50: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
1e60: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69  zName)+1);.    i
1e70: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
1e80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1e90: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
1ea0: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
1eb0: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
1ec0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
1ed0: 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20  dex(Index *p){. 
1ee0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
1ef0: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
1f00: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
1f10: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1f20: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1f30: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1f40: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1f50: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1f60: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1f70: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1f80: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1f90: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
1fa0: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
1fb0: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
1fc0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
1fd0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
1fe0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
1ff0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
2000: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
2010: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
2020: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2030: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
2040: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
2050: 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70   *p){.  Index *p
2060: 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Old;..  assert( 
2070: 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d  db!=0 && p->zNam
2080: 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d  e!=0 );.  pOld =
2090: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
20a0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
20b0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e  Db].idxHash, p->
20c0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
20f0: 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  )+1, 0);.  if( p
2100: 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21 3d  Old!=0 && pOld!=
2110: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
2120: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2130: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48  aDb[p->iDb].idxH
2140: 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  ash, pOld->zName
2150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2160: 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 4f         strlen(pO
2170: 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f  ld->zName)+1, pO
2180: 6c 64 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 49  ld);.  }.  freeI
2190: 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ndex(p);.}../*.*
21a0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
21b0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  en index from it
21c0: 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  s table, then re
21d0: 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  move.** the inde
21e0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
21f0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2200: 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a  free its memory.
2210: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ** structures..*
2220: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2230: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2240: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2250: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2260: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2270: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2280: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c  .  int len;..  l
2290: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78  en = strlen(zIdx
22a0: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
22b0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
22c0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  ert(&db->aDb[iDb
22d0: 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49 64 78 4e  ].idxHash, zIdxN
22e0: 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a  ame, len+1, 0);.
22f0: 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
2300: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
2310: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
2320: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
2330: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2340: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
2350: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
2360: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
2370: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  p;.      for(p=p
2380: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
2390: 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70  Index; p && p->p
23a0: 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d  Next!=pIndex; p=
23b0: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
23c0: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e    if( p && p->pN
23d0: 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ext==pIndex ){. 
23e0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
23f0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
2400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2410: 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e     freeIndex(pIn
2420: 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  dex);.  }.  db->
2430: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2440: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
2450: 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
2460: 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61  l schema informa
2470: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e  tion from the in
2480: 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
2490: 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67  les of.** a sing
24a0: 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  le database.  Th
24b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
24c0: 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20  lled to reclaim 
24d0: 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65  memory.** before
24e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6c   the database cl
24f0: 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73  oses.  It is als
2500: 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  o called during 
2510: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  a rollback.** if
2520: 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65   there were sche
2530: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
2540: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2550: 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68  n or if a.** sch
2560: 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61  ema-cookie misma
2570: 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  tch occurs..**.*
2580: 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e  * If iDb<=0 then
2590: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
25a0: 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65  nal schema table
25b0: 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
25c0: 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66  se.** files.  If
25d0: 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73   iDb>=2 then res
25e0: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
25f0: 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20  schema for only 
2600: 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69  the.** single fi
2610: 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  le indicated..*/
2620: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
2630: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2640: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2650: 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c  t iDb){.  HashEl
2660: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
2670: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
2680: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20  temp2;.  int i, 
2690: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  j;..  assert( iD
26a0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
26b0: 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  nDb );.  db->fla
26c0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
26d0: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72  itialized;.  for
26e0: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
26f0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
2700: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2710: 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20  i];.    temp1 = 
2720: 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  pDb->tblHash;.  
2730: 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74    temp2 = pDb->t
2740: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c  rigHash;.    sql
2750: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44  ite3HashInit(&pD
2760: 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  b->trigHash, SQL
2770: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
2780: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2790: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
27a0: 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  aFKey);.    sqli
27b0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
27c0: 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20  b->idxHash);.   
27d0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
27e0: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
27f0: 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  2); pElem; pElem
2800: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2810: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 73  pElem)){.      s
2820: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
2830: 67 65 72 28 28 54 72 69 67 67 65 72 2a 29 73 71  ger((Trigger*)sq
2840: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
2850: 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  em));.    }.    
2860: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
2870: 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71  (&temp2);.    sq
2880: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
2890: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c  Db->tblHash, SQL
28a0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
28b0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c   0);.    for(pEl
28c0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
28d0: 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65  st(&temp1); pEle
28e0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
28f0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2900: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2910: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
2920: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2930: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2940: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2950: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2960: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
2970: 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50  1);.    DbClearP
2980: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
2990: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b  B_SchemaLoaded);
29a0: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
29b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
29c0: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
29d0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
29e0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
29f0: 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  anges;..  /* If 
2a00: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
2a10: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2a20: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
2a30: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
2a40: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
2a50: 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  en from the auxi
2a60: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
2a70: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
2a80: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
2a90: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
2aa0: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
2ab0: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
2ac0: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
2ad0: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
2ae0: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
2af0: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
2b00: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
2b10: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
2b20: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2b30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
2b40: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2b50: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
2b60: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2b70: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2b80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2b90: 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62  pDb->pAux && pDb
2ba0: 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62  ->xFreeAux ) pDb
2bb0: 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e  ->xFreeAux(pDb->
2bc0: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62  pAux);.      pDb
2bd0: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
2be0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  }.  }.  for(i=j=
2bf0: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
2c00: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
2c10: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2c20: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
2c30: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
2c40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44     sqliteFree(pD
2c50: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2c60: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
2c70: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2c80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
2c90: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
2ca0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
2cb0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
2cc0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
2cd0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
2ce0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
2cf0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
2d00: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
2d10: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
2d20: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
2d30: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
2d40: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
2d50: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
2d60: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
2d70: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
2d80: 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29  iteFree(db->aDb)
2d90: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
2da0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
2db0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2dc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2dd0: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  ed whenever a ro
2de0: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20  llback occurs.  
2df0: 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a  If there were.**
2e00: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
2e10: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
2e20: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20  action, then we 
2e30: 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68  have to reset th
2e40: 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61  e.** internal ha
2e50: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65  sh tables and re
2e60: 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64  load them from d
2e70: 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  isk..*/.void sql
2e80: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  ite3RollbackInte
2e90: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
2ea0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
2eb0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2ec0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2ed0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
2ee0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2ef0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ma(db, 0);.  }.}
2f00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2f20: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
2f30: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
2f40: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
2f50: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
2f60: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
2f70: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
2f80: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
2f90: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
2fa0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
2fb0: 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  om a table or vi
2fc0: 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ew..*/.static vo
2fd0: 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  id sqliteResetCo
2fe0: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
2ff0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
3000: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
3010: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
3020: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ble!=0 );.  for(
3030: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65  i=0, pCol=pTable
3040: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65  ->aCol; i<pTable
3050: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
3060: 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  l++){.    sqlite
3070: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Free(pCol->zName
3080: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3090: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
30a0: 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Dflt);.    sqlit
30b0: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  eFree(pCol->zTyp
30c0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
30d0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
30e0: 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43  l);.  pTable->aC
30f0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
3100: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
3110: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
3120: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
3130: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3140: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
3150: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
3160: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3170: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
3180: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
3190: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
31a0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
31b0: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
31c0: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
31d0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
31e0: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
31f0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3200: 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72  .  Nor does it r
3210: 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e  emove.** foreign
3220: 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73   keys from the s
3230: 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68  qlite.aFKey hash
3240: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
3250: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
3260: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
3270: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
3280: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3290: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
32a0: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
32b0: 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61  .**.** Indices a
32c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
32d0: 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c  he table are unl
32e0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22  inked from the "
32f0: 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75  db".** data stru
3300: 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c  cture if db!=NUL
3310: 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c  L.  If db==NULL,
3320: 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65   indices attache
3330: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
3340: 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62  e are deleted, b
3350: 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  ut it is assumed
3360: 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61   they have alrea
3370: 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e  dy been.** unlin
3380: 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ked..*/.void sql
3390: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
33a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
33b0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
33c0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
33d0: 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46  Next;.  FKey *pF
33e0: 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b  Key, *pNextFKey;
33f0: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
3400: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
3410: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
3420: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
3430: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
3440: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
3450: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
3460: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
3470: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
3480: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3490: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
34a0: 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70  ( pIndex->iDb==p
34b0: 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70  Table->iDb || (p
34c0: 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26  Table->iDb==0 &&
34d0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29   pIndex->iDb==1)
34e0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   );.    sqliteDe
34f0: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
3500: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
3510: 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65   Delete all fore
3520: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
3530: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3540: 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20  ble.  The keys. 
3550: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
3560: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c  already been unl
3570: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64  inked from the d
3580: 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61  b->aFKey hash ta
3590: 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble .  */.  for(
35a0: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
35b0: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
35c0: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
35d0: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
35e0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
35f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
3600: 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20  le->iDb<db->nDb 
3610: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
3620: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
3630: 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e  db->aDb[pTable->
3640: 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20  iDb].aFKey,.    
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54         pFKey->zT
3670: 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d  o, strlen(pFKey-
3680: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
3690: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
36a0: 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20  e(pFKey);.  }.. 
36b0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
36c0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
36d0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
36e0: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
36f0: 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20  ames(pTable);.  
3700: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3710: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
3720: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
3730: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
3740: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3750: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
3760: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
3770: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Table);.}../*.**
3780: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
3790: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
37a0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
37b0: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
37c0: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
37d0: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
37e0: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
37f0: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
3800: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
3810: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
3820: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
3830: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3840: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
3850: 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70  le *p;.  FKey *p
3860: 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a  F1, *pF2;.  Db *
3870: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
3880: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
3890: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
38a0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
38b0: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26  sert( zTabName &
38c0: 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b  & zTabName[0] );
38d0: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
38e0: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
38f0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3900: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  &pDb->tblHash, z
3910: 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  TabName, strlen(
3920: 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  zTabName)+1, 0);
3930: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
3940: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
3950: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
3960: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
3970: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
3980: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
3990: 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71  ;.      pF2 = sq
39a0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
39b0: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  Db->aFKey, pF1->
39c0: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
39d0: 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b   if( pF2==pF1 ){
39e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
39f0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
3a00: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
3a10: 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78  , nTo, pF1->pNex
3a20: 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tTo);.      }els
3a30: 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e{.        while
3a40: 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e  ( pF2 && pF2->pN
3a50: 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46  extTo!=pF1 ){ pF
3a60: 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20  2=pF2->pNextTo; 
3a70: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  }.        if( pF
3a80: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  2 ){.          p
3a90: 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46  F2->pNextTo = pF
3aa0: 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20  1->pNextTo;.    
3ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ac0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
3ad0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
3ae0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
3af0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
3b00: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3b10: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
3b20: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
3b30: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
3b40: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
3b50: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77   that.** token w
3b60: 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f  ith any quotatio
3b70: 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61  ns removed.  Spa
3b80: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
3b90: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
3ba0: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
3bb0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
3bc0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
3bd0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
3be0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
3bf0: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
3c00: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f 69   really just poi
3c10: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
3c20: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
3c30: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
3c40: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
3c50: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
3c60: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
3c70: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3c80: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
3c90: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
3ca0: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
3cb0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
3cc0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
3cd0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
3ce0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
3cf0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
3d00: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
3d10: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3d20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
3d30: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
3d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
3d50: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
3d60: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
3d70: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
3d80: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3d90: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
3da0: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
3db0: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
3dc0: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
3dd0: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
3de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3df0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
3e00: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44  (Vdbe *v, int iD
3e10: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
3e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3e30: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
3e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3e50: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3e60: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
3e70: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
3e80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
3e90: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
3ea0: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
3eb0: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
3ec0: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  s */.}../*.** Th
3ed0: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
3ee0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
3ef0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
3f00: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
3f10: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
3f20: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
3f30: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
3f40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3f50: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
3f60: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
3f70: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
3f80: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
3f90: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
3fa0: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
3fb0: 74 20 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33  t findDb(sqlite3
3fc0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
3fd0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
3fe0: 44 62 20 2a 70 44 62 3b 0a 20 20 66 6f 72 28 70  Db *pDb;.  for(p
3ff0: 44 62 3d 64 62 2d 3e 61 44 62 2c 20 69 3d 30 3b  Db=db->aDb, i=0;
4000: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 2c   i<db->nDb; i++,
4010: 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28   pDb++){.    if(
4020: 20 70 4e 61 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65   pName->n==strle
4030: 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  n(pDb->zName) &&
4040: 20 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c   .        0==sql
4050: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 44 62  ite3StrNICmp(pDb
4060: 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ->zName, pName->
4070: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20 29 7b 0a  z, pName->n) ){.
4080: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
4090: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
40a0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn -1;.}../* The
40b0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f   table or view o
40c0: 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69  r trigger name i
40d0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
40e0: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
40f0: 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  ens.** pName1 an
4100: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
4110: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
4120: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4130: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   for example:.**
4140: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4150: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
4160: 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  ** .** Then pNam
4170: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
4180: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
4190: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
41a0: 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65  r hand if.** the
41b0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
41c0: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
41d0: 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20  ed, i.e.:.**.** 
41e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
41f0: 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  (...);.**.** The
4200: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4210: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
4220: 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a  me2 is ""..**.**
4230: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
4240: 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c  ts the *ppUnqual
4250: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
4260: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
4270: 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61  pName1 or.** pNa
4280: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
4290: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
42a0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
42b0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
42c0: 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22  * database "xxx"
42d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
42e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50  .int sqlite3TwoP
42f0: 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  artName(.  Parse
4300: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
4310: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
4320: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
4330: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
4340: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f   *pName1,      /
4350: 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74  * The "xxx" in t
4360: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
4370: 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20  " or "xxx" */.  
4380: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
4390: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
43a0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
43b0: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
43c0: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
43d0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
43e0: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
43f0: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
4400: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4420: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
4430: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
4440: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4450: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
4460: 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
4470: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
4480: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
4490: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70  t.busy );.    *p
44a0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
44b0: 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44  .    iDb = findD
44c0: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
44d0: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
44e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
44f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
4500: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
4510: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
4520: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4530: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
4540: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
4550: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4560: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
4570: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
4580: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
4590: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
45a0: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
45b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
45c0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
45d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
45e0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
45f0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
4600: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
4610: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
4620: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
4630: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
4640: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
4650: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
4660: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
4670: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
4680: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
4690: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
46a0: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
46b0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
46c0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
46d0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
46e0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
46f0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
4700: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
4710: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
4720: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
4730: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
4740: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
4750: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
4760: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
4770: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
4780: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
4790: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
47a0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
47b0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
47c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
47d0: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
47e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
47f0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
4800: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
4810: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
4820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4830: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4840: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
4850: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
4860: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
4870: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
4880: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
4890: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
48a0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
48b0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
48c0: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
48d0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
48e0: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
48f0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
4900: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
4910: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
4920: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
4930: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
4940: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
4950: 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b  he.** pStart tok
4960: 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45  en is the CREATE
4970: 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68   and pName is th
4980: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
4990: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
49a0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
49b0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
49c0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
49d0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
49e0: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
49f0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
4a00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
4a10: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
4a20: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
4a30: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
4a40: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
4a50: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
4a60: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
4a70: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
4a80: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
4a90: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
4aa0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
4ab0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4ac0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
4ad0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
4ae0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
4af0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
4b00: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
4b10: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
4b20: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
4b30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
4b40: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
4b50: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
4b60: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
4b70: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
4b80: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
4b90: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
4ba0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
4bb0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
4bc0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
4bd0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
4be0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
4bf0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
4c00: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
4c10: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4c20: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
4c30: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
4c40: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
4c50: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
4c60: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
4c70: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
4c80: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
4c90: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
4ca0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
4cb0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
4cc0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
4cd0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
4ce0: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
4cf0: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
4d00: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
4d10: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
4d20: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
4d30: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
4d40: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
4d50: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
4d60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
4d70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4d80: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
4d90: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
4da0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4db0: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
4dc0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
4dd0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4de0: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
4df0: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
4e00: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
4e10: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
4e20: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
4e30: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
4e40: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4e50: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
4e60: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
4e70: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4e80: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4e90: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4ea0: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
4eb0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
4ec0: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4ed0: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
4ee0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4ef0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
4f00: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
4f10: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
4f20: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
4f30: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
4f40: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
4f50: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
4f60: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
4f70: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
4f80: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4f90: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
4fa0: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
4fb0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
4fc0: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
4fd0: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
4fe0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
4ff0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
5000: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
5010: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
5020: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5030: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
5040: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
5050: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
5060: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
5070: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5080: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
5090: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
50a0: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
50b0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
50c0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
50d0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
50e0: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
50f0: 72 6e 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70  rn;.  if( isTemp
5100: 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   && iDb>1 ){.   
5110: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
5120: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
5130: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
5140: 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20  e qualified */. 
5150: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5160: 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70  sg(pParse, "temp
5170: 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  orary table name
5180: 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69   must be unquali
5190: 66 69 65 64 22 29 3b 0a 20 20 20 20 70 50 61 72  fied");.    pPar
51a0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
51b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
51c0: 28 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d  ( isTemp ) iDb =
51d0: 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73   1;..  pParse->s
51e0: 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61  NameToken = *pNa
51f0: 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  me;.  zName = sq
5200: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
5210: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
5220: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
5230: 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  rn;.  if( SQLITE
5240: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
5250: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
5260: 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
5270: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
5280: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
5290: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
52a0: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
52b0: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
52c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
52d0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
52e0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
52f0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
5300: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
5310: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
5320: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
5330: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
5340: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
5350: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
5360: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
5370: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
5380: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5390: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
53a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
53b0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
53c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  ){.      if( isT
53d0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
53e0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
53f0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ATE_TEMP_VIEW;. 
5400: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5410: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5420: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20  E_CREATE_VIEW;. 
5430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
5440: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
5450: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
5460: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5470: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  TE_TEMP_TABLE;. 
5480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5490: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
54a0: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a  E_CREATE_TABLE;.
54b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
54c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
54d0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
54e0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
54f0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Db) ){.      sql
5500: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
5510: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5520: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
5530: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
5540: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
5550: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
5560: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
5570: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
5580: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
5590: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
55a0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
55b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
55c0: 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f  ** it does..  */
55d0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
55e0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
55f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 72 65  ema(pParse) ) re
5600: 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d  turn;.  pTable =
5610: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
5620: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d  e(db, zName, db-
5630: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
5640: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29  ;.  if( pTable )
5650: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5660: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5670: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
5680: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
5690: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
56a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
56b0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
56c0: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
56d0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
56e0: 2c 20 30 29 29 21 3d 30 20 26 26 20 0a 20 20 20  , 0))!=0 && .   
56f0: 20 20 20 28 20 69 44 62 3d 3d 30 20 7c 7c 20 21     ( iDb==0 || !
5700: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29  db->init.busy) )
5710: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5720: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5730: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
5740: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25  an index named %
5750: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
5760: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
5770: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5780: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
5790: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
57a0: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
57b0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
57c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
57d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
57e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
57f0: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  +;.    sqliteFre
5800: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
5810: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
5820: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
5830: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  e;.  pTable->nCo
5840: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
5850: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
5860: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
5870: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  .  pTable->pInde
5880: 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  x = 0;.  pTable-
5890: 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66  >iDb = iDb;.  if
58a0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
58b0: 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c  ble ) sqlite3Del
58c0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61  eteTable(db, pPa
58d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b  rse->pNewTable);
58e0: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
58f0: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
5900: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5910: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
5920: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
5930: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
5940: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
5950: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
5960: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
5970: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
5980: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
5990: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
59a0: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
59b0: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
59c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
59d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
59e0: 4d 45 4e 54 0a 20 20 69 66 28 20 73 74 72 63 6d  MENT.  if( strcm
59f0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5a00: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
5a10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
5a20: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54  ->aDb[iDb].pSeqT
5a30: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 64 62 2d  ab==0 );.    db-
5a40: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61  >aDb[iDb].pSeqTa
5a50: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
5a60: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
5a70: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
5a80: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5a90: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
5aa0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
5ab0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
5ac0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
5ad0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
5ae0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
5af0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
5b00: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
5b10: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
5b20: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
5b30: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
5b40: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
5b50: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
5b60: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
5b70: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
5b80: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
5b90: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
5ba0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
5bb0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
5bc0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
5bd0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
5be0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
5bf0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5c00: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
5c10: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
5c20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
5c30: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
5c40: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5c50: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
5c60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
5c70: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
5c80: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
5c90: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 65 72 79 20  ;..    /* Every 
5ca0: 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62 6c 65  time a new table
5cb0: 20 69 73 20 63 72 65 61 74 65 64 20 74 68 65 20   is created the 
5cc0: 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20  file-format.    
5cd0: 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  ** and encoding 
5ce0: 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20  meta-values are 
5cf0: 73 65 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  set in the datab
5d00: 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a 20 63  ase, in.    ** c
5d10: 61 73 65 20 74 68 69 73 20 69 73 20 74 68 65 20  ase this is the 
5d20: 66 69 72 73 74 20 74 61 62 6c 65 20 63 72 65 61  first table crea
5d30: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
5d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d50: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5d60: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
5d70: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5d80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5d90: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
5da0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5dc0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c  nteger, db->enc,
5dd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5de0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5df0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
5e00: 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  4);..    /* This
5e10: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
5e20: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
5e30: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
5e40: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
5e50: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
5e60: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
5e70: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
5e80: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
5e90: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
5ea0: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
5eb0: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
5ec0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
5ed0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
5ee0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
5ef0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
5f00: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
5f10: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
5f20: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
5f30: 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   The rowid value
5f40: 20 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68   is needed by th
5f50: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
5f60: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
5f70: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
5f80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5f90: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
5fa0: 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ble(v, iDb);.   
5fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5fc0: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
5fd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
5fe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5ff0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
6000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6010: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6020: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  g8, 0, 0);.    s
6030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6040: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
6050: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6060: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6070: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
6080: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
6090: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
60a0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
60b0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
60c0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
60d0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
60e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
60f0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
6100: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
6110: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
6120: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
6130: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
6140: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
6150: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
6160: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
6170: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6180: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
6190: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
61a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
61b0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
61c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
61d0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
61e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
61f0: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
6200: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
6210: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6220: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
6230: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
6240: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
6250: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
6260: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
6270: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
6280: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
6290: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d  te3StrICmp(z, p-
62a0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  >aCol[i].zName)=
62b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
62c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
62d0: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
62e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
62f0: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
6300: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
6310: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6320: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
6330: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
6340: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
6350: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
6360: 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f  eRealloc( p->aCo
6370: 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  l, (p->nCol+8)*s
6380: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
6390: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
63a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
63b0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
63c0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
63d0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
63e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
63f0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
6400: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
6410: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
6420: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
6430: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
6440: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
6450: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
6460: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
6470: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
6480: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
6490: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
64a0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
64b0: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
64c0: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
64d0: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
64e0: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
64f0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
6500: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
6510: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
6520: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
6530: 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  oll;.  p->nCol++
6540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6550: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6560: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
6570: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
6580: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
6590: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
65a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
65b0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
65c0: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
65d0: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
65e0: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
65f0: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
6600: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
6610: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
6620: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6630: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
6640: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
6650: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
6660: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
6670: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6680: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6690: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
66a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
66b0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
66c0: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
66d0: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
66e0: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
66f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6700: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
6710: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
6720: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
6730: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
6740: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6750: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
6760: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
6770: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
6780: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
6790: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
67a0: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
67b0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
67c0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
67d0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
67e0: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
67f0: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
6800: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
6810: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
6820: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
6830: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
6840: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
6850: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
6860: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
6870: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
6880: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
6890: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
68a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
68b0: 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20   Token *pFirst, 
68c0: 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20  Token *pLast){. 
68d0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
68e0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a   i, j;.  int n;.
68f0: 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b    char *z, **pz;
6900: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
6910: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
6920: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
6930: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
6940: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
6950: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
6960: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
6970: 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70  ol[i];.  pz = &p
6980: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20  Col->zType;.  n 
6990: 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 28 70 4c  = pLast->n + (pL
69a0: 61 73 74 2d 3e 7a 20 2d 20 70 46 69 72 73 74 2d  ast->z - pFirst-
69b0: 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >z);.  assert( p
69c0: 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b  Col->zType==0 );
69d0: 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  .  z = pCol->zTy
69e0: 70 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  pe = sqlite3MPri
69f0: 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 2c 20 70  ntf("%.*s", n, p
6a00: 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 69 66 28  First->z);.  if(
6a10: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
6a20: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69    for(i=j=0; z[i
6a30: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ]; i++){.    int
6a40: 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69   c = z[i];.    i
6a50: 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20  f( isspace(c) ) 
6a60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b  continue;.    z[
6a70: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  j++] = c;.  }.  
6a80: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c  z[j] = 0;.  pCol
6a90: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
6aa0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
6ab0: 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (z, n);.}../*.**
6ac0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
6ad0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
6ae0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
6af0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
6b00: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
6b10: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
6b20: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6b30: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
6b40: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
6b50: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
6b60: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
6b70: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
6b80: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
6b90: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
6ba0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6bb0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
6bc0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
6bd0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
6be0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
6bf0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
6c00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6c10: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
6c20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6c30: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62  r *pExpr){.  Tab
6c40: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
6c50: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
6c60: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6c70: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6c80: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e  ;.  pCol = &(p->
6c90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
6ca0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
6cb0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
6cc0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
6cd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6ce0: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
6cf0: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
6d00: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
6d10: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 70 43 6f  nt",.        pCo
6d20: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  l->zName);.  }el
6d30: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
6d40: 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e  xprDelete(pCol->
6d50: 70 44 66 6c 74 29 3b 0a 20 20 20 20 70 43 6f 6c  pDflt);.    pCol
6d60: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
6d70: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
6d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6d90: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
6da0: 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  xpr, 0, 0);.  }.
6db0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6dc0: 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  ete(pExpr);.}../
6dd0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
6de0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
6df0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
6e00: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
6e10: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
6e20: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
6e30: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
6e40: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
6e50: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
6e60: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
6e70: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
6e80: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
6e90: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
6ea0: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
6eb0: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
6ec0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
6ed0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
6ee0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
6ef0: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
6f00: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
6f10: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
6f20: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
6f30: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
6f40: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
6f50: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
6f60: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
6f70: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
6f80: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
6f90: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
6fa0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
6fb0: 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f  w id.  (Exceptio
6fc0: 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61  n:.** For backwa
6fd0: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
6fe0: 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74  y with older dat
6ff0: 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64  abases, do not d
7000: 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65  o this.** if the
7010: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72   file format ver
7020: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c  sion number is l
7030: 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65  ess than 1.)  Se
7040: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
7050: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
7060: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
7070: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
7080: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
7090: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
70a0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
70b0: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
70c0: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
70d0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
70e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
70f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
7100: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
7110: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7120: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
7130: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
7140: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
7150: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
7160: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
7170: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
7180: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
7190: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
71a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
71b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
71c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
71d0: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
71e0: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
71f0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
7200: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
7210: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
7220: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
7230: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
7240: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 20 20 20    int autoInc   
7250: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
7260: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
7270: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
7280: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
7290: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
72a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
72b0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
72c0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
72d0: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
72e0: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
72f0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
7300: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
7310: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
7320: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7330: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
7340: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
7350: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
7360: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
7370: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
7380: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
7390: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
73a0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
73b0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
73c0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
73d0: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
73e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
73f0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
7400: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
7410: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
7420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7430: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
7440: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
7450: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
7460: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
7470: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7480: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
7490: 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l].zName)==0 ){.
74a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
74b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
74c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
74d0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70  l<pTab->nCol ) p
74e0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
74f0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
7500: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
7510: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
7520: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
7530: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
7540: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
7550: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
7560: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
7570: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
7580: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
7590: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
75a0: 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20  NTEGER")==0 ){. 
75b0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
75c0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
75d0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
75e0: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
75f0: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
7600: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
7610: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
7620: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7630: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
7640: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7650: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
7660: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
7670: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
7680: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
7690: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
76a0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
76b0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
76c0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
76d0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
76e0: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  or, 0, 0);.    p
76f0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
7700: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
7710: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
7720: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
7730: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
7740: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
7750: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
7760: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7770: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
7780: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
7790: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
77a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
77b0: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
77c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
77d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
77e0: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54   int nType){.  T
77f0: 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78  able *p;.  Index
7800: 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65   *pIdx;.  CollSe
7810: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
7820: 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  i;..  if( (p = p
7830: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7840: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
7850: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
7860: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
7870: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
7880: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e  pParse, zType, n
7890: 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c  Type);.  p->aCol
78a0: 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  [i].pColl = pCol
78b0: 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  l;..  /* If the 
78c0: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
78d0: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
78e0: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
78f0: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20  E <type>",.  ** 
7900: 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61  then an index ma
7910: 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61  y have been crea
7920: 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75  ted on this colu
7930: 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  mn before the.  
7940: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
7950: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
7960: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
7970: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
7980: 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70  /.  for(pIdx = p
7990: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
79a0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
79b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
79c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
79d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
79e0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
79f0: 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  ) pIdx->keyInfo.
7a00: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c  aColl[0] = pColl
7a10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
7a20: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
7a30: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
7a40: 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68  he db.aCollSeq h
7a50: 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68  ash table. If th
7a60: 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69  e entry.** speci
7a70: 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e  fied by zName an
7a80: 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66  d nName is not f
7a90: 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d 65 74  ound and paramet
7aa0: 65 72 20 27 63 72 65 61 74 65 27 20 69 73 0a 2a  er 'create' is.*
7ab0: 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65  * true, then cre
7ac0: 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 2e  ate a new entry.
7ad0: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
7ae0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61  n NULL..**.** Ea
7af0: 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f 72 65  ch pointer store
7b00: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  d in the sqlite3
7b10: 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74  .aCollSeq hash t
7b20: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  able contains an
7b30: 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74 68 72  .** array of thr
7b40: 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63  ee CollSeq struc
7b50: 74 75 72 65 73 2e 20 54 68 65 20 66 69 72 73 74  tures. The first
7b60: 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   is the collatio
7b70: 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72  n sequence.** pr
7b80: 65 66 66 65 72 72 65 64 20 66 6f 72 20 55 54 46  efferred for UTF
7b90: 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 55  -8, the second U
7ba0: 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74 68 65  TF-16le, and the
7bb0: 20 74 68 69 72 64 20 55 54 46 2d 31 36 62 65 2e   third UTF-16be.
7bc0: 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d  .**.** Stored im
7bd0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
7be0: 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c 61 74  the three collat
7bf0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 69 73  ion sequences is
7c00: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
7c10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
7c20: 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69  ence name. A poi
7c30: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72  nter to this str
7c40: 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ing is stored in
7c50: 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61 74 69  .** each collati
7c60: 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74 72 75  on sequence stru
7c70: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
7c80: 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43   CollSeq * findC
7c90: 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20 20 73  ollSeqEntry(.  s
7ca0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
7cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
7cc0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20  .  int nName,.  
7cd0: 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20  int create.){.  
7ce0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
7cf0: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20    if( nName<0 ) 
7d00: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
7d10: 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d  Name);.  pColl =
7d20: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
7d30: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
7d40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a  zName, nName);..
7d50: 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26    if( 0==pColl &
7d60: 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20 20  & create ){.    
7d70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pColl = sqliteMa
7d80: 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28 2a  lloc( 3*sizeof(*
7d90: 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b  pColl) + nName +
7da0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
7db0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
7dc0: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63  ll[0].zName = (c
7dd0: 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a  har*)&pColl[3];.
7de0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65        pColl[0].e
7df0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
7e00: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d  ;.      pColl[1]
7e10: 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  .zName = (char*)
7e20: 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20  &pColl[3];.     
7e30: 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20   pColl[1].enc = 
7e40: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a  SQLITE_UTF16LE;.
7e50: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a        pColl[2].z
7e60: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
7e70: 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70  Coll[3];.      p
7e80: 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51  Coll[2].enc = SQ
7e90: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
7ea0: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c      memcpy(pColl
7eb0: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [0].zName, zName
7ec0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
7ed0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e  pColl[0].zName[n
7ee0: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
7ef0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
7f00: 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  rt(&db->aCollSeq
7f10: 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65  , pColl[0].zName
7f20: 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b  , nName, pColl);
7f30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7f40: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
7f50: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
7f60: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ame points to a 
7f70: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
7f80: 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65 73  ring nName bytes
7f90: 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e   long..** Return
7fa0: 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f   the CollSeq* po
7fb0: 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  inter for the co
7fc0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7fd0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20   named zName.** 
7fe0: 66 6f 72 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  for the encoding
7ff0: 20 27 65 6e 63 27 20 66 72 6f 6d 20 74 68 65 20   'enc' from the 
8000: 64 61 74 61 62 61 73 65 20 27 64 62 27 2e 0a 2a  database 'db'..*
8010: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e 74 72  *.** If the entr
8020: 79 20 73 70 65 63 69 66 69 65 64 20 69 73 20 6e  y specified is n
8030: 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 27 63 72  ot found and 'cr
8040: 65 61 74 65 27 20 69 73 20 74 72 75 65 2c 20 74  eate' is true, t
8050: 68 65 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a 20  hen create a.** 
8060: 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f 74 68 65  new entry.  Othe
8070: 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c  rwise return NUL
8080: 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  L..*/.CollSeq *s
8090: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
80a0: 71 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  q(.  sqlite3 *db
80b0: 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f  ,.  u8 enc,.  co
80c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
80d0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20  .  int nName,.  
80e0: 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20  int create.){.  
80f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8100: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
8110: 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  y(db, zName, nNa
8120: 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a 20 20 61  me, create);.  a
8130: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 55 54  ssert( SQLITE_UT
8140: 46 38 3d 3d 31 20 26 26 20 53 51 4c 49 54 45 5f  F8==1 && SQLITE_
8150: 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53 51  UTF16LE==2 && SQ
8160: 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33 20  LITE_UTF16BE==3 
8170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63  );.  assert( enc
8180: 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26  >=SQLITE_UTF8 &&
8190: 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46   enc<=SQLITE_UTF
81a0: 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 70 43  16BE );.  if( pC
81b0: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65  oll ) pColl += e
81c0: 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  nc-1;.  return p
81d0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Coll;.}../*.** I
81e0: 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f 6c 6c 61  nvoke the 'colla
81f0: 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c  tion needed' cal
8200: 6c 62 61 63 6b 20 74 6f 20 72 65 71 75 65 73 74  lback to request
8210: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
8220: 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20  uence.** in the 
8230: 64 61 74 61 62 61 73 65 20 74 65 78 74 20 65 6e  database text en
8240: 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d 65 20 7a  coding of name z
8250: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
8260: 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  me..** If the co
8270: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8280: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8290: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73  callCollNeeded(s
82a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
82b0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
82c0: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 61 73 73  nt nName){.  ass
82d0: 65 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e  ert( !db->xCollN
82e0: 65 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43  eeded || !db->xC
82f0: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b 0a 20  ollNeeded16 );. 
8300: 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e   if( nName<0 ) n
8310: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
8320: 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ame);.  if( db->
8330: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20  xCollNeeded ){. 
8340: 20 20 20 63 68 61 72 20 2a 7a 45 78 74 65 72 6e     char *zExtern
8350: 61 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  al = sqliteStrND
8360: 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  up(zName, nName)
8370: 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74 65  ;.    if( !zExte
8380: 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  rnal ) return;. 
8390: 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64     db->xCollNeed
83a0: 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  ed(db->pCollNeed
83b0: 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29  edArg, db, (int)
83c0: 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e  db->enc, zExtern
83d0: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  al);.    sqliteF
83e0: 72 65 65 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  ree(zExternal);.
83f0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 78 43    }.  if( db->xC
8400: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 7b 0a 20  ollNeeded16 ){. 
8410: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
8420: 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20 20 73 71  External;.    sq
8430: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d  lite3_value *pTm
8440: 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 72  p = sqlite3GetTr
8450: 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 64 62 29  ansientValue(db)
8460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
8470: 75 65 53 65 74 53 74 72 28 70 54 6d 70 2c 20 2d  ueSetStr(pTmp, -
8480: 31 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  1, zName, SQLITE
8490: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
84a0: 41 54 49 43 29 3b 0a 20 20 20 20 7a 45 78 74 65  ATIC);.    zExte
84b0: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  rnal = sqlite3Va
84c0: 6c 75 65 54 65 78 74 28 70 54 6d 70 2c 20 53 51  lueText(pTmp, SQ
84d0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
84e0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74  );.    if( !zExt
84f0: 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a  ernal ) return;.
8500: 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65      db->xCollNee
8510: 64 65 64 31 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e  ded16(db->pCollN
8520: 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69  eededArg, db, (i
8530: 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74  nt)db->enc, zExt
8540: 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ernal);.  }.}../
8550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8560: 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  e is called if t
8570: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
8580: 74 6f 72 79 20 66 61 69 6c 73 20 74 6f 20 64 65  tory fails to de
8590: 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61  liver a.** colla
85a0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e  tion function in
85b0: 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f 64 69   the best encodi
85c0: 6e 67 20 62 75 74 20 74 68 65 72 65 20 6d 61 79  ng but there may
85d0: 20 62 65 20 6f 74 68 65 72 20 76 65 72 73 69 6f   be other versio
85e0: 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f  ns.** of this co
85f0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
8600: 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65 78 74   (for other text
8610: 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76 61 69   encodings) avai
8620: 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a  lable. Use one.*
8630: 2a 20 6f 66 20 74 68 65 73 65 20 69 6e 73 74 65  * of these inste
8640: 61 64 20 69 66 20 74 68 65 79 20 65 78 69 73 74  ad if they exist
8650: 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d 38 20  . Avoid a UTF-8 
8660: 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76 65  <-> UTF-16 conve
8670: 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73  rsion if.** poss
8680: 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ible..*/.static 
8690: 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71  int synthCollSeq
86a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
86b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
86c0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
86d0: 6c 32 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20  l2;.  char *z = 
86e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
86f0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
8700: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
8710: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8720: 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
8730: 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d   const u8 aEnc[]
8740: 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55 54 46 31   = { SQLITE_UTF1
8750: 36 42 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  6BE, SQLITE_UTF1
8760: 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  6LE, SQLITE_UTF8
8770: 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   };.  for(i=0; i
8780: 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  <3; i++){.    pC
8790: 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69  oll2 = sqlite3Fi
87a0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45  ndCollSeq(db, aE
87b0: 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b  nc[i], z, n, 0);
87c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d  .    if( pColl2-
87d0: 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20  >xCmp!=0 ){.    
87e0: 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20    memcpy(pColl, 
87f0: 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43  pColl2, sizeof(C
8800: 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20 20 20 20  ollSeq));.      
8810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8830: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
8840: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8850: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8860: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
8870: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e  ion sequence: %.
8880: 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d 0a  *s", n, z);.  }.
8890: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
88a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
88b0: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
88c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
88d0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f  s called on a co
88e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
88f0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75 73   before it is us
8900: 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74  ed to.** check t
8910: 68 61 74 20 69 74 20 69 73 20 64 65 66 69 6e 65  hat it is define
8920: 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65 64 20  d. An undefined 
8930: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8940: 63 65 20 65 78 69 73 74 73 20 77 68 65 6e 0a 2a  ce exists when.*
8950: 2a 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  * a database is 
8960: 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f 6e 74  loaded that cont
8970: 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  ains references 
8980: 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  to collation seq
8990: 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20 68  uences.** that h
89a0: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64 65 66  ave not been def
89b0: 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ined by sqlite3_
89c0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
89d0: 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66  () etc..**.** If
89e0: 20 72 65 71 75 69 72 65 64 2c 20 74 68 69 73 20   required, this 
89f0: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68  routine calls th
8a00: 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  e 'collation nee
8a10: 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ded' callback to
8a20: 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20 64 65  .** request a de
8a30: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
8a40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8a50: 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f 65 73  ce. If this does
8a60: 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e  n't work, .** an
8a70: 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c   equivalent coll
8a80: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
8a90: 68 61 74 20 75 73 65 73 20 61 20 74 65 78 74 20  hat uses a text 
8aa0: 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65 72 65  encoding differe
8ab0: 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d  nt.** from the m
8ac0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
8ad0: 73 75 62 73 74 69 74 75 74 65 64 2c 20 69 66 20  substituted, if 
8ae0: 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  one is available
8af0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8b00: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72  CheckCollSeq(Par
8b10: 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
8b20: 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
8b30: 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f  f( pColl && !pCo
8b40: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
8b50: 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* No collation 
8b60: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
8b70: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 65   type for this e
8b80: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73  ncoding is regis
8b90: 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61  tered..    ** Ca
8ba0: 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ll the collation
8bb0: 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20   factory to see 
8bc0: 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79  if it can supply
8bd0: 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20   us with one..  
8be0: 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c    */.    callCol
8bf0: 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e  lNeeded(pParse->
8c00: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
8c10: 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e  , strlen(pColl->
8c20: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69 66 28  zName));.    if(
8c30: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26   !pColl->xCmp &&
8c40: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50   synthCollSeq(pP
8c50: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a  arse, pColl) ){.
8c60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8c70: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
8c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8c90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8ca0: 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 68  * Call sqlite3Ch
8cb0: 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72  eckCollSeq() for
8cc0: 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73   all collating s
8cd0: 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20 69  equences in an i
8ce0: 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ndex,.** in orde
8cf0: 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  r to verify that
8d00: 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61   all the necessa
8d10: 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ry collating seq
8d20: 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f  uences are.** lo
8d30: 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  aded..*/.int sql
8d40: 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f  ite3CheckIndexCo
8d50: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
8d60: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
8d70: 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b  ){.  if( pIdx ){
8d80: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
8d90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
8da0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
8db0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8dc0: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
8dd0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49  arse, pIdx->keyI
8de0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b  nfo.aColl[i]) ){
8df0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8e00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8e10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8e20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8e30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
8e40: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
8e50: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
8e60: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
8e70: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
8e80: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
8e90: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
8ea0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
8eb0: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
8ec0: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
8ed0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
8ee0: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
8ef0: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
8f00: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
8f10: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
8f20: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
8f30: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
8f40: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
8f50: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
8f60: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
8f70: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
8f80: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
8f90: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
8fa0: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
8fb0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
8fc0: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
8fd0: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
8fe0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
8ff0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
9000: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
9010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9020: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
9030: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
9040: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
9050: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
9060: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
9070: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
9080: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
9090: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f  ** pParse..*/.Co
90a0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
90b0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
90c0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
90d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
90e0: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65  t nName){.  u8 e
90f0: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
9100: 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62  >enc;.  u8 initb
9110: 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  usy = pParse->db
9120: 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43  ->init.busy;.  C
9130: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9140: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9150: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65  eq(pParse->db, e
9160: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
9170: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
9180: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61  f( nName<0 ) nNa
9190: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
91a0: 65 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  e);.  if( !initb
91b0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
91c0: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
91d0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c  ){.    /* No col
91e0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
91f0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f 72  of this type for
9200: 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69   this encoding i
9210: 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20  s registered..  
9220: 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f    ** Call the co
9230: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9240: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
9250: 20 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20   supply us with 
9260: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
9270: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70  callCollNeeded(p
9280: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
9290: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43  , nName);.    pC
92a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
92b0: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
92c0: 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  >db, enc, zName,
92d0: 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   nName, 0);.    
92e0: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43  if( pColl && !pC
92f0: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
9300: 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 61 79 20     /* There may 
9310: 62 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  be a version of 
9320: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
9330: 71 75 65 6e 63 65 20 74 68 61 74 20 72 65 71 75  quence that requ
9340: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 72  ires.      ** tr
9350: 61 6e 73 6c 61 74 69 6f 6e 20 62 65 74 77 65 65  anslation betwee
9360: 6e 20 65 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61  n encodings. Sea
9370: 72 63 68 20 66 6f 72 20 69 74 20 77 69 74 68 20  rch for it with 
9380: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a  synthCollSeq()..
9390: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
93a0: 66 28 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  f( synthCollSeq(
93b0: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
93c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
93d0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
93e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
93f0: 6f 74 68 69 6e 67 20 68 61 73 20 62 65 65 6e 20  othing has been 
9400: 66 6f 75 6e 64 2c 20 77 72 69 74 65 20 74 68 65  found, write the
9410: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9420: 6e 74 6f 20 70 50 61 72 73 65 20 2a 2f 0a 20 20  nto pParse */.  
9430: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
9440: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
9450: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
9460: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
9470: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  r==0 ){.      sq
9480: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9490: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
94a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
94b0: 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c  e: %.*s", nName,
94c0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
94d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
94e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
94f0: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  ;.}..../*.** Sca
9500: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
9510: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
9520: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
9530: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
9540: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
9550: 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68 61 72 20  y type..*/.char 
9560: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
9570: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
9580: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
9590: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20  ){.  int n, i;. 
95a0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
95b0: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
95c0: 20 63 68 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a   char *zSub;  /*
95d0: 20 4b 65 79 77 6f 72 64 73 20 73 75 62 73 74 72   Keywords substr
95e0: 69 6e 67 20 74 6f 20 73 65 61 72 63 68 20 66 6f  ing to search fo
95f0: 72 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 6e 53  r */.    char nS
9600: 75 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 6c  ub;         /* l
9610: 65 6e 67 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f  ength of zSub */
9620: 0a 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69  .    char affini
9630: 74 79 3b 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  ty;     /* Affin
9640: 69 74 79 20 74 6f 20 72 65 74 75 72 6e 20 69 66  ity to return if
9650: 20 69 74 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20   it matches */. 
9660: 20 7d 20 73 75 62 73 74 72 69 6e 67 73 5b 5d 20   } substrings[] 
9670: 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20  = {.    {"INT", 
9680: 20 33 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49   3, SQLITE_AFF_I
9690: 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43  NTEGER},.    {"C
96a0: 48 41 52 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  HAR", 4, SQLITE_
96b0: 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b  AFF_TEXT},.    {
96c0: 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54  "CLOB", 4, SQLIT
96d0: 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20  E_AFF_TEXT},.   
96e0: 20 7b 22 54 45 58 54 22 2c 20 34 2c 20 53 51 4c   {"TEXT", 4, SQL
96f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20  ITE_AFF_TEXT},. 
9700: 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53     {"BLOB", 4, S
9710: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c  QLITE_AFF_NONE},
9720: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6e 54 79  .  };..  if( nTy
9730: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pe==0 ){.    ret
9740: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
9750: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ONE;.  }.  for(i
9760: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 73 75 62  =0; i<sizeof(sub
9770: 73 74 72 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28  strings)/sizeof(
9780: 73 75 62 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20  substrings[0]); 
9790: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 31  i++){.    int c1
97a0: 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d   = substrings[i]
97b0: 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20 20 20 69 6e  .zSub[0];.    in
97c0: 74 20 63 32 20 3d 20 74 6f 6c 6f 77 65 72 28 63  t c2 = tolower(c
97d0: 31 29 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  1);.    int limi
97e0: 74 20 3d 20 6e 54 79 70 65 20 2d 20 73 75 62 73  t = nType - subs
97f0: 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a  trings[i].nSub;.
9800: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9810: 7a 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69  z = substrings[i
9820: 5d 2e 7a 53 75 62 3b 0a 20 20 20 20 66 6f 72 28  ].zSub;.    for(
9830: 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e  n=0; n<=limit; n
9840: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ++){.      int c
9850: 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20 20   = zType[n];.   
9860: 20 20 20 69 66 28 20 28 63 3d 3d 63 31 20 7c 7c     if( (c==c1 ||
9870: 20 63 3d 3d 63 32 29 0a 20 20 20 20 20 20 20 20   c==c2).        
9880: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
9890: 65 33 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70  e3StrNICmp(&zTyp
98a0: 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73 74 72 69  e[n], z, substri
98b0: 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20 29 7b 0a  ngs[i].nSub) ){.
98c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
98d0: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61 66 66  ubstrings[i].aff
98e0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20  inity;.      }. 
98f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9900: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
9910: 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ERIC;.}../*.** G
9920: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
9930: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
9940: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
9950: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
9960: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
9970: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
9980: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
9990: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
99a0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
99b0: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
99c0: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
99d0: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
99e0: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
99f0: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
9a00: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
9a10: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
9a20: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
9a30: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
9a40: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
9a50: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
9a60: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
9a70: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
9a80: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
9a90: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
9aa0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
9ab0: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
9ac0: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
9ad0: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
9ae0: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
9af0: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
9b00: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
9b10: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
9b20: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
9b30: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
9b40: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
9b50: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
9b60: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
9b70: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
9b80: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
9b90: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
9ba0: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
9bb0: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
9bc0: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
9bd0: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
9be0: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
9bf0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
9c00: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ie(sqlite3 *db, 
9c10: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62  Vdbe *v, int iDb
9c20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
9c30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
9c40: 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ger, db->aDb[iDb
9c50: 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ].schema_cookie+
9c60: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
9c70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9c80: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
9c90: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  0);.}../*.** Mea
9ca0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
9cb0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
9cc0: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
9cd0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
9ce0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
9cf0: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
9d00: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
9d10: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
9d20: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
9d30: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
9d40: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
9d50: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
9d60: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
9d70: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
9d80: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
9d90: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
9da0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
9db0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
9dc0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
9dd0: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
9de0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
9df0: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
9e00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
9e10: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  + 2;.}../*.** Wr
9e20: 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65  ite an identifie
9e30: 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  r onto the end o
9e40: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
9e50: 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74  ng.  Add.** quot
9e60: 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20  e characters as 
9e70: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
9e80: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
9e90: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
9ea0: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
9eb0: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
9ec0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
9ed0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
9ee0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
9ef0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
9f00: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
9f10: 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  Idx;.  for(j=0; 
9f20: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
9f30: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
9f40: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
9f50: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
9f60: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
9f70: 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e  edQuote =  zIden
9f80: 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67  t[j]!=0 || isdig
9f90: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
9fc0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
9fd0: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e  !=TK_ID;.  if( n
9fe0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
9ff0: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
a000: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
a010: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
a020: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
a030: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
a040: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
a050: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
a060: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
a070: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
a080: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
a090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a0a0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
a0b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
a0c0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
a0d0: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
a0e0: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
a0f0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
a100: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
a110: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
a120: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
a130: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
a140: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
a150: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
a160: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
a170: 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70  bleStmt(Table *p
a180: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
a190: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
a1a0: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
a1b0: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a  zSep2, *zEnd, *z
a1c0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
a1d0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
a1e0: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
a1f0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
a200: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
a210: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
a220: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
a230: 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e  ;.    z = pCol->
a240: 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a  zType;.    if( z
a250: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28   ){.      n += (
a260: 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a  strlen(z) + 1);.
a270: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d      }.  }.  n +=
a280: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
a290: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
a2a0: 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  50 ){.    zSep =
a2b0: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
a2c0: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
a2d0: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
a2e0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
a2f0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
a300: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
a310: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
a320: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
a330: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
a340: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
a350: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
a360: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
a370: 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70   strcpy(zStmt, p
a380: 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45 41  ->iDb==1 ? "CREA
a390: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20  TE TEMP TABLE " 
a3a0: 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  : "CREATE TABLE 
a3b0: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
a3c0: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
a3d0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
a3e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
a3f0: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
a400: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
a410: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
a420: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
a430: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
a440: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
a450: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
a460: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
a470: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
a480: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
a490: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
a4a0: 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43  .    if( (z = pC
a4b0: 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b  ol->zType)!=0 ){
a4c0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b  .      zStmt[k++
a4d0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73  ] = ' ';.      s
a4e0: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
a4f0: 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20   z);.      k += 
a500: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d  strlen(z);.    }
a510: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
a520: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
a530: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
a540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a550: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a560: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
a570: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
a580: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
a590: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
a5a0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
a5b0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
a5c0: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
a5d0: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
a5e0: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
a5f0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
a600: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
a610: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
a620: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
a630: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
a640: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
a650: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
a660: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
a670: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
a680: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
a690: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
a6a0: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
a6b0: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
a6c0: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
a6d0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
a6e0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
a6f0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
a700: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
a710: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
a720: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
a730: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
a740: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
a750: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
a760: 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20  changes, so the 
a770: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
a780: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
a790: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
a7a0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a7b0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
a7c0: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
a7d0: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
a7e0: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
a7f0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
a800: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
a810: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
a820: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
a830: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
a840: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
a850: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
a860: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
a870: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
a880: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
a890: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
a8a0: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
a8b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
a8c0: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
a8d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
a8e0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
a8f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  se, Token *pEnd,
a900: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
a910: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
a920: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a930: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
a940: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
a950: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
a960: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
a970: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
a980: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
a990: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a9a0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
a9b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
a9c0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
a9d0: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
a9e0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
a9f0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
aa00: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
aa10: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
aa20: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
aa30: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
aa40: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
aa50: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
aa60: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
aa70: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
aa80: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
aa90: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
aaa0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
aab0: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
aac0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
aad0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
aae0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
aaf0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
ab00: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
ab10: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
ab20: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
ab30: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
ab40: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
ab50: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
ab60: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
ab70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
ab80: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
ab90: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
aba0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
abb0: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
abc0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
abd0: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
abe0: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
abf0: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
ac00: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
ac10: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
ac20: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
ac30: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
ac40: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
ac50: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
ac60: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
ac70: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
ac80: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
ac90: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
aca0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
acb0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
acc0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
acd0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
ace0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
acf0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
ad00: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
ad10: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
ad20: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
ad30: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
ad40: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
ad50: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
ad60: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
ad70: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
ad80: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
ad90: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
ada0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
adb0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
adc0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
add0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ade0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
adf0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
ae00: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
ae10: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
ae20: 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20  nd push it onto 
ae30: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
ae40: 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20  * A view has no 
ae50: 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73  rootpage, so jus
ae60: 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e  t push a zero on
ae70: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72  to the stack for
ae80: 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20  .    ** views.  
ae90: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
aea0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
aeb0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
aec0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
aed0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
aee0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
aef0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
af10: 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c  teTable, p->iDb,
af20: 20 30 29 3b 0a 20 20 20 20 20 20 7a 54 79 70 65   0);.      zType
af30: 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
af40: 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
af50: 45 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  E";.    }else{. 
af60: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
af70: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
af80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
af90: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
afa0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
afb0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
afc0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 20 20 20 20  2 = "VIEW";.    
afd0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
afe0: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
aff0: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
b000: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
b010: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
b020: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
b030: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
b040: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
b050: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
b060: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
b070: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
b080: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
b090: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
b0a0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
b0b0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
b0c0: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
b0d0: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
b0e0: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
b0f0: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
b100: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
b110: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
b120: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
b130: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
b140: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b150: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
b160: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
b170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
b190: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
b1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1b0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
b1c0: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
b1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1e0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
b1f0: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
b200: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
b210: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
b220: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
b230: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62  pSelect, SRT_Tab
b240: 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20  le, 1, 0, 0, 0, 
b250: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b260: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b270: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
b280: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
b290: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
b2a0: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
b2b0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
b2c0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
b2d0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
b2e0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
b2f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
b300: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
b310: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
b320: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
b330: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
b340: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
b350: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
b360: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
b370: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
b380: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
b390: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
b3a0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
b3b0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
b3c0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
b3d0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
b3e0: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
b3f0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
b400: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
b410: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
b420: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
b430: 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d  leStmt(p);.    }
b440: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
b450: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
b460: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 4e 61  Addr(pParse->sNa
b470: 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  meToken.z) + 1;.
b480: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
b490: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52  lite3MPrintf("CR
b4a0: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
b4b0: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
b4c0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
b4d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
b4e0: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
b4f0: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
b500: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
b510: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
b520: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
b530: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
b540: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
b550: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
b560: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
b570: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
b580: 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69  ected.  The rowi
b590: 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c  d for the preall
b5a0: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c  ocated.    ** sl
b5b0: 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74  ot is the 2nd it
b5c0: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
b5d0: 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65    The top of the
b5e0: 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20   stack is the.  
b5f0: 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66    ** root page f
b600: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
b610: 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73   (or a 0 if this
b620: 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20   is a view)..   
b630: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
b640: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
b650: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
b660: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
b670: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
b680: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
b690: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
b6a0: 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  =#0, sql=%Q ".  
b6b0: 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
b6c0: 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d  d=#1",.      db-
b6d0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61  >aDb[p->iDb].zNa
b6e0: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
b6f0: 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20 20  (p->iDb),.      
b700: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
b710: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
b720: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74  zName,.      zSt
b730: 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
b740: 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b  liteFree(zStmt);
b750: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
b760: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
b770: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
b780: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
b790: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
b7a0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
b7b0: 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20  , v, p->iDb);.  
b7c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b7d0: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
b7e0: 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a 20  ma, p->iDb, 0,. 
b7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
b800: 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d  rintf("tbl_name=
b810: 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c  '%q'",p->zName),
b820: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
b830: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
b840: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
b850: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
b860: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
b870: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
b880: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
b890: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
b8a0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
b8b0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
b8c0: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44 62 20  *pFKey; .    Db 
b8d0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
b8e0: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c  p->iDb];.    pOl
b8f0: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
b900: 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48  nsert(&pDb->tblH
b910: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
b920: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
b930: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
b940: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
b950: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
b960: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
b970: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
b980: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
b990: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
b9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
b9b0: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
b9c0: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
b9d0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
b9e0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
b9f0: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
ba00: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
ba10: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
ba20: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
ba30: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
ba40: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
ba50: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
ba60: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
ba70: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
ba80: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
ba90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
baa0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
bab0: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
bac0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
bad0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
bae0: 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ges;.  }.}..#ifn
baf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bb00: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
bb10: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
bb20: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
bb30: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
bb40: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
bb50: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
bb60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
bb70: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
bb80: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bb90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
bba0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
bbb0: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
bbc0: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
bbd0: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
bbe0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
bbf0: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
bc00: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
bc10: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
bc20: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
bc30: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
bc40: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
bc50: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
bc60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
bc70: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
bc80: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
bc90: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
bca0: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
bcb0: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
bcc0: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
bcd0: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
bce0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
bcf0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
bd00: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
bd10: 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
bd20: 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
bd30: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
bd40: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72  ;..  sqlite3Star
bd50: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
bd60: 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70  Begin, pName1, p
bd70: 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
bd80: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
bd90: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
bda0: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
bdb0: 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
bdc0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
bdd0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
bde0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
bdf0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
be00: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
be10: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
be20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
be30: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
be40: 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76  arse, p->iDb, "v
be50: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
be60: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65   && sqlite3FixSe
be70: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
be80: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
be90: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
bea0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
beb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
bec0: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
bed0: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
bee0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
bef0: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
bf00: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
bf10: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
bf20: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
bf30: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
bf40: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
bf50: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
bf60: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
bf70: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
bf80: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
bf90: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
bfa0: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
bfb0: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
bfc0: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
bfd0: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
bfe0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
bff0: 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63  SelectDup(pSelec
c000: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
c010: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c020: 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  t);.  if( !pPars
c030: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
c040: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c050: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
c060: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
c070: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
c080: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
c090: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
c0a0: 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
c0b0: 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
c0c0: 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
c0d0: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
c0e0: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  stToken;.  if( s
c0f0: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73  End.z[0]!=0 && s
c100: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
c110: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
c120: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
c130: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73  d.n = 0;.  n = s
c140: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
c150: 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  z;.  z = (const 
c160: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
c170: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
c180: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
c190: 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63  ]==';' || isspac
c1a0: 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d  e(z[n-1])) ){ n-
c1b0: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
c1c0: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
c1d0: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
c1e0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
c1f0: 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
c200: 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
c210: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
c220: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
c230: 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64  le(pParse, &sEnd
c240: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
c250: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c260: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
c270: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c280: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
c290: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
c2a0: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
c2b0: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
c2c0: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
c2d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
c2e0: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
c2f0: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
c300: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
c310: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
c320: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
c330: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
c340: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
c350: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
c360: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
c370: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
c380: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
c390: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
c3a0: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
c3b0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
c3c0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
c3d0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
c3e0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
c3f0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
c400: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
c410: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
c420: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
c430: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
c440: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
c450: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
c460: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
c470: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
c480: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
c490: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
c4a0: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
c4b0: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
c4c0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
c4d0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
c4e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
c4f0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
c500: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
c510: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
c520: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
c530: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
c540: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
c550: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
c560: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
c570: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
c580: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
c590: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
c5a0: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
c5b0: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
c5c0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
c5d0: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
c5e0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
c5f0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
c600: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
c610: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
c620: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
c630: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
c640: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
c650: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
c660: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
c670: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c680: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
c690: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
c6a0: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
c6b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
c6c0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
c6d0: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
c6e0: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
c6f0: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
c700: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
c710: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
c720: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
c730: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
c740: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
c750: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
c760: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
c770: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
c780: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
c790: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
c7a0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
c7b0: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
c7c0: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
c7d0: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
c7e0: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
c7f0: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
c800: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
c810: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
c820: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
c830: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
c840: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
c850: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
c860: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
c870: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
c880: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
c890: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
c8a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c8b0: 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  (pEList);.  if( 
c8c0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20  pSel->pEList==0 
c8d0: 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c  ){.    pSel->pEL
c8e0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
c8f0: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
c900: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
c910: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  .  }.  pTable->n
c920: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c  Col = -1;.  pSel
c930: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
c940: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
c950: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
c960: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
c970: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
c980: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
c990: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
c9a0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
c9b0: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
c9c0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
c9d0: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
c9e0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
c9f0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
ca00: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
ca10: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
ca20: 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74  lTab);.    DbSet
ca30: 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d  Property(pParse-
ca40: 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  >db, pTable->iDb
ca50: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
ca60: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
ca70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
ca80: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
ca90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
caa0: 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a  ctUnbind(pSel);.
cab0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
cac0: 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45  tDelete(pSel->pE
cad0: 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70  List);.  pSel->p
cae0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
caf0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
cb00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
cb10: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
cb20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cb30: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
cb40: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
cb50: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
cb60: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
cb70: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
cb80: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
cb90: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
cba0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
cbb0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
cbc0: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
cbd0: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
cbe0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
cbf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
cc00: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
cc10: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
cc20: 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  tblHash); i; i=s
cc30: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
cc40: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
cc50: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
cc60: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
cc70: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
cc80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73  .      sqliteRes
cc90: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
cca0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
ccb0: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
ccc0: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
ccd0: 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
cce0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
ccf0: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
cd00: 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
cd10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
cd20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
cd30: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
cd40: 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
cd50: 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
cd60: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
cd70: 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
cd80: 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
cd90: 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
cda0: 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
cdb0: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
cdc0: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
cdd0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
cde0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
cdf0: 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
ce00: 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  o..*/.#ifndef SQ
ce10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ce20: 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
ce30: 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44  3RootPageMoved(D
ce40: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f  b *pDb, int iFro
ce50: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
ce60: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
ce70: 20 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73    .  for(pElem=s
ce80: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
ce90: 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  pDb->tblHash); p
cea0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
ceb0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
cec0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
ced0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
cee0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
cef0: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
cf00: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
cf10: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
cf20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
cf30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
cf40: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
cf50: 46 69 72 73 74 28 26 70 44 62 2d 3e 69 64 78 48  First(&pDb->idxH
cf60: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
cf70: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
cf80: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
cf90: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
cfa0: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
cfb0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
cfc0: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
cfd0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
cfe0: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72  m = iTo;.      r
cff0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
d000: 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a 7d 0a  .  assert(0);.}.
d010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
d020: 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
d030: 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
d040: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
d050: 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
d060: 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
d070: 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
d080: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
d090: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
d0a0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
d0b0: 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
d0c0: 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
d0d0: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
d0e0: 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
d0f0: 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
d100: 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
d110: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
d120: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
d130: 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
d140: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
d150: 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
d160: 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
d170: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
d180: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
d190: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
d1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d1b0: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
d1c0: 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23   iTable, iDb);.#
d1d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d1e0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
d1f0: 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75  /* OP_Destroy pu
d200: 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20  shes an integer 
d210: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20  onto the stack. 
d220: 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
d230: 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
d240: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
d250: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
d260: 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
d270: 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
d280: 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
d290: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
d2a0: 6f 64 69 66 69 73 20 74 68 65 20 73 71 6c 69 74  odifis the sqlit
d2b0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
d2c0: 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
d2d0: 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
d2e0: 68 65 20 22 23 30 22 20 69 6e 20 74 68 65 20 53  he "#0" in the S
d2f0: 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
d300: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
d310: 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
d320: 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68  ue.  ** is on th
d330: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
d340: 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ck.  See sqlite3
d350: 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a  RegisterExpr()..
d360: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
d370: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
d380: 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
d390: 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
d3a0: 67 65 3d 25 64 20 57 48 45 52 45 20 23 30 20 41  ge=%d WHERE #0 A
d3b0: 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c  ND rootpage=#0",
d3c0: 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  .     pParse->db
d3d0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
d3e0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
d3f0: 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65  Db), iTable);.#e
d400: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ndif.}../*.** Wr
d410: 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
d420: 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
d430: 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
d440: 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
d450: 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
d460: 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
d470: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
d480: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
d490: 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
d4a0: 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
d4b0: 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
d4c0: 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
d4d0: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
d4e0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
d4f0: 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
d500: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
d510: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
d520: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
d530: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
d540: 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
d550: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
d560: 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
d570: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d580: 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
d590: 70 49 64 78 3b 0a 20 20 64 65 73 74 72 6f 79 52  pIdx;.  destroyR
d5a0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
d5b0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pTab->tnum, pTab
d5c0: 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  ->iDb);.  for(pI
d5d0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d5e0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d5f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
d600: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
d610: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
d620: 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20  , pIdx->iDb);.  
d630: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
d640: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
d650: 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
d660: 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
d670: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d680: 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
d690: 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
d6a0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
d6b0: 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
d6c0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
d6d0: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
d6e0: 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
d6f0: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
d700: 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
d710: 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
d720: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
d730: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
d740: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
d750: 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
d760: 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
d770: 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
d780: 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
d790: 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
d7a0: 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
d7b0: 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
d7c0: 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
d7d0: 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
d7e0: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
d7f0: 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
d800: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
d810: 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
d820: 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
d830: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
d840: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
d850: 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
d860: 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
d870: 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
d880: 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
d890: 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
d8a0: 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
d8b0: 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
d8c0: 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
d8d0: 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
d8e0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
d8f0: 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
d900: 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
d910: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
d920: 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
d930: 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
d940: 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
d950: 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
d960: 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
d970: 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
d980: 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
d990: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
d9a0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d9b0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d9c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
d9d0: 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
d9e0: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
d9f0: 65 72 74 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d  ert( pIdx->iDb==
da00: 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20  pTab->iDb );.   
da10: 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
da20: 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
da30: 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
da40: 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
da50: 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
da60: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
da70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
da80: 4c 61 72 67 65 73 74 3d 3d 30 20 29 20 72 65 74  Largest==0 ) ret
da90: 75 72 6e 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  urn;.    destroy
daa0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
dab0: 20 69 4c 61 72 67 65 73 74 2c 20 70 54 61 62 2d   iLargest, pTab-
dac0: 3e 69 44 62 29 3b 0a 20 20 20 20 69 44 65 73 74  >iDb);.    iDest
dad0: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
dae0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
daf0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
db00: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
db10: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
db20: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
db30: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
db40: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
db50: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
db60: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
db70: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
db80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
db90: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
dba0: 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54  int isView){.  T
dbb0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
dbc0: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
dbd0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
dbe0: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
dbf0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
dc00: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
dc10: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
dc20: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
dc30: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  e;.  assert( pNa
dc40: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
dc50: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
dc60: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
dc70: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
dc80: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
dc90: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20  ].zDatabase);.. 
dca0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
dcb0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
dcc0: 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  ble;.  iDb = pTa
dcd0: 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  b->iDb;.  assert
dce0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
dcf0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64  db->nDb );.#ifnd
dd00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dd10: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
dd20: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
dd30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dd40: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
dd50: 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  LE(pTab->iDb);. 
dd60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dd70: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
dd80: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
dd90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
dda0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
ddb0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
ddc0: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
ddd0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
dde0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
ddf0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
de00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
de10: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
de20: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
de30: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
de40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
de50: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
de60: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
de70: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
de80: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
de90: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
dea0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
deb0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
dec0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
ded0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
dee0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
def0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
df00: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
df10: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
df20: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
df30: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
df40: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
df50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
df60: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
df70: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
df80: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
df90: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
dfa0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
dfb0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
dfc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
dfd0: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
dfe0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
dff0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e000: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
e010: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
e020: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
e030: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
e040: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e050: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
e060: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
e070: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
e080: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e090: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
e0a0: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
e0b0: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
e0c0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
e0d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
e0e0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
e0f0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
e100: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
e110: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e120: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
e130: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
e140: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
e150: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e160: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e170: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  p_table;.  }..  
e180: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e190: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
e1a0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
e1b0: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
e1c0: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
e1d0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e1e0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
e1f0: 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67  ( v ){.    Trigg
e200: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
e210: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
e220: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
e230: 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44  rse, 0, pTab->iD
e240: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  b);..    /* Drop
e250: 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
e260: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
e270: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
e280: 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20  opped. Code.    
e290: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
e2a0: 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
e2b0: 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
e2c0: 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20  ster and/or.    
e2d0: 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
e2e0: 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
e2f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  d..    */.    pT
e300: 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
e310: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69  Trigger;.    whi
e320: 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
e330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e340: 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61  rigger->iDb==pTa
e350: 62 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67  b->iDb || pTrigg
e360: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
e370: 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
e380: 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
e390: 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a  , pTrigger, 1);.
e3a0: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
e3b0: 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
e3c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e3d0: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
e3e0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
e3f0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
e400: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
e410: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
e420: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
e430: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
e440: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
e450: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
e460: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
e470: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
e480: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
e490: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
e4a0: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
e4b0: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
e4c0: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
e4d0: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
e4e0: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
e4f0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
e500: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
e510: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
e520: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
e530: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
e540: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
e550: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
e560: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
e570: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
e580: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
e590: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
e5a0: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
e5b0: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70         db->aDb[p
e5c0: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c  Tab->iDb].zName,
e5d0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54   SCHEMA_TABLE(pT
e5e0: 61 62 2d 3e 69 44 62 29 2c 20 70 54 61 62 2d 3e  ab->iDb), pTab->
e5f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
e600: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
e610: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
e620: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  arse, pTab);.   
e630: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
e640: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
e650: 54 61 62 6c 65 2c 20 70 54 61 62 2d 3e 69 44 62  Table, pTab->iDb
e660: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
e670: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
e680: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
e690: 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64  b, iDb);..exit_d
e6a0: 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
e6b0: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
e6c0: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
e6d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e6e0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
e6f0: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
e700: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
e710: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
e720: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
e730: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
e740: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
e750: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
e760: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
e770: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
e780: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
e790: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
e7a0: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
e7b0: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
e7c0: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
e7d0: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
e7e0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
e7f0: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
e800: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
e810: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
e820: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
e830: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
e840: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
e850: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
e860: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
e870: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
e880: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
e890: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
e8a0: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
e8b0: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
e8c0: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
e8d0: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
e8e0: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
e8f0: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
e900: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
e910: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
e920: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
e930: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
e940: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
e950: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
e960: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
e970: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
e980: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
e990: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
e9a0: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
e9b0: 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61  til sqlite3EndTa
e9c0: 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
e9d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
e9e0: 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
e9f0: 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
ea00: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
ea10: 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
ea20: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
ea30: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
ea40: 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
ea50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
ea60: 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
ea70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ea80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ea90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
eaa0: 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
eab0: 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
eac0: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
ead0: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
eae0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
eaf0: 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
eb00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
eb10: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
eb20: 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
eb30: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
eb40: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
eb50: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
eb60: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
eb70: 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
eb80: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
eb90: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
eba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
ebb0: 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
ebc0: 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c  FKey = 0;.  Tabl
ebd0: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
ebe0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
ebf0: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
ec00: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
ec10: 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
ec20: 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
ec30: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
ec40: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b  ->nErr ) goto fk
ec50: 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
ec60: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
ec70: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
ec80: 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  l-1;.    if( iCo
ec90: 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  l<0 ) goto fk_en
eca0: 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
ecb0: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
ecc0: 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
ecd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ece0: 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
ecf0: 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
ed00: 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
ed10: 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
ed20: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
ed30: 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
ed40: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
ed50: 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
ed60: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
ed70: 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
ed80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
ed90: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
eda0: 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
edb0: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
edc0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
edd0: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
ede0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
edf0: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
ee00: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
ee10: 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
ee20: 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
ee30: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
ee40: 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
ee50: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
ee60: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
ee70: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
ee80: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
ee90: 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43  eof(*pFKey) + nC
eea0: 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  ol*sizeof(pFKey-
eeb0: 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
eec0: 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
eed0: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
eee0: 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
eef0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ef00: 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65    nByte += strle
ef10: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
ef20: 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
ef30: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
ef40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
ef50: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
ef60: 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  y==0 ) goto fk_e
ef70: 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72  nd;.  pFKey->pFr
ef80: 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
ef90: 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
efa0: 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
efb0: 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20  ar*)&pFKey[1];. 
efc0: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28   pFKey->aCol = (
efd0: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29  struct sColMap*)
efe0: 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66  z;.  z += sizeof
eff0: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29  (struct sColMap)
f000: 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e  *nCol;.  pFKey->
f010: 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
f020: 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
f030: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
f040: 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54  ] = 0;.  z += pT
f050: 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
f060: 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20  >pNextTo = 0;.  
f070: 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  pFKey->nCol = nC
f080: 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  ol;.  if( pFromC
f090: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b  ol==0 ){.    pFK
f0a0: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
f0b0: 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  m = p->nCol-1;. 
f0c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
f0d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
f0e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
f0f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
f100: 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
f110: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
f120: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  te3StrICmp(p->aC
f130: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
f140: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
f150: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
f160: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
f170: 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
f180: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f1a0: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
f1b0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
f1c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f1d0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
f1e0: 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     "unknown colu
f1f0: 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72  mn \"%s\" in for
f200: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
f210: 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ion", .         
f220: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
f230: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
f240: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
f250: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
f260: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
f270: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
f280: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
f290: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
f2a0: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
f2b0: 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
f2c0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
f2d0: 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
f2e0: 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
f2f0: 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
f300: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
f310: 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
f320: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
f330: 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
f340: 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
f350: 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66  f = flags & 0xff
f360: 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
f370: 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  eConf = (flags >
f380: 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20  > 8 ) & 0xff;.  
f390: 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
f3a0: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36  f = (flags >> 16
f3b0: 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a   ) & 0xff;..  /*
f3c0: 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
f3d0: 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
f3e0: 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
f3f0: 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
f400: 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
f410: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
f420: 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  nd:.  sqliteFree
f430: 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20  (pFKey);.#endif 
f440: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
f450: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
f460: 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
f470: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
f480: 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
f490: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
f4a0: 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  te(pToCol);.}../
f4b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f4c0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
f4d0: 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
f4e0: 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
f4f0: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
f500: 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
f510: 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
f520: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
f530: 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
f540: 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
f550: 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
f560: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
f570: 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
f580: 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
f590: 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
f5a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
f5b0: 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
f5c0: 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
f5d0: 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
f5e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f5f0: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
f600: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f610: 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
f620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f630: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f640: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f650: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
f660: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
f670: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
f680: 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
f690: 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
f6a0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79   return;.  pFKey
f6b0: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69  ->isDeferred = i
f6c0: 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
f6d0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
f6e0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
f6f0: 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
f700: 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
f710: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
f720: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
f730: 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
f740: 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
f750: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
f760: 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
f770: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
f780: 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
f790: 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
f7a0: 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
f7b0: 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
f7c0: 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
f7d0: 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
f7e0: 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72  ated.  The memor
f7f0: 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64  y cell specified
f800: 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
f810: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
f820: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
f830: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
f840: 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
f850: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
f860: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
f870: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
f880: 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
f890: 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
f8a0: 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
f8b0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
f8c0: 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
f8d0: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
f8e0: 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
f8f0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
f900: 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
f910: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
f920: 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
f930: 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
f940: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
f950: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
f960: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
f970: 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
f980: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
f990: 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20  se->nTab;       
f9a0: 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
f9b0: 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
f9c0: 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
f9d0: 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20  arse->nTab+1;   
f9e0: 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
f9f0: 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
fa00: 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  x */.  int addr1
fa10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fa20: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
fa30: 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
fa40: 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
fa70: 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56   of index */.  V
fa80: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
faa0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
fab0: 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
fac0: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e   machine */.  in
fad0: 74 20 69 73 55 6e 69 71 75 65 3b 20 20 20 20 20  t isUnique;     
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
faf0: 54 72 75 65 20 66 6f 72 20 61 20 75 6e 69 71 75  True for a uniqu
fb00: 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 76 20  e index */..  v 
fb10: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fb20: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
fb30: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
fb40: 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
fb50: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
fb60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fb70: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
fb80: 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
fb90: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
fba0: 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
fbb0: 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
fbc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fbd0: 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
fbe0: 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  um, pIndex->iDb)
fbf0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
fc00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
fc10: 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e  nteger, pIndex->
fc20: 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  iDb, 0);.  sqlit
fc30: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
fc40: 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
fc50: 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20   tnum,.         
fc60: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
fc70: 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
fc80: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
fc90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
fca0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
fcb0: 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
fcc0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
fcd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
fce0: 65 61 64 2c 20 69 54 61 62 2c 20 70 54 61 62 2d  ead, iTab, pTab-
fcf0: 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >tnum);.  sqlite
fd00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fd10: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
fd20: 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  iTab, pTab->nCol
fd30: 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
fd40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fd50: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
fd60: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  , 0);.  sqlite3G
fd70: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
fd80: 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29  v, pIndex, iTab)
fd90: 3b 0a 20 20 69 73 55 6e 69 71 75 65 20 3d 20 70  ;.  isUnique = p
fda0: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
fdb0: 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c 69 74  OE_None;.  sqlit
fdc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fdd0: 50 5f 49 64 78 50 75 74 2c 20 69 49 64 78 2c 20  P_IdxPut, iIdx, 
fde0: 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 69 66 28  isUnique);.  if(
fdf0: 20 69 73 55 6e 69 71 75 65 20 29 7b 0a 20 20 20   isUnique ){.   
fe00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fe10: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64  geP3(v, -1, "ind
fe20: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
fe30: 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
fe40: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20  _STATIC);.  }.  
fe50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe60: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
fe70: 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73  b, addr1+1);.  s
fe80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fe90: 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c  P2(v, addr1, sql
fea0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
feb0: 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74  ddr(v));.  sqlit
fec0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fed0: 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30  P_Close, iTab, 0
fee0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
fef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
ff00: 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a  e, iIdx, 0);.}..
ff10: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
ff20: 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
ff30: 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64  SQL table.  pInd
ff40: 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ex is the name o
ff50: 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
ff60: 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68  and pTable is th
ff70: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
ff80: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
ff90: 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
ffa0: 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
ffb0: 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
ffc0: 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
ffd0: 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
ffe0: 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
fff0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
10000 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
10010 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
10020 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
10030 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
10040 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
10050 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
10060 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
10070 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
10080 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
10090 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
100a0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
100b0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
100c0 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
100d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
100e0 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
100f0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
10100 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
10110 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
10120 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
10130 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
10140 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
10150 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
10160 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
10170 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
10180 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10190 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
101a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
101b0 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
101c0 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
101d0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
101e0 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
101f0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
10200 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
10210 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10220 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
10230 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
10240 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
10250 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
10260 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62  TblName,  /* Tab
10270 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
10280 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10290 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
102a0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
102b0 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
102c0 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
102d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
102e0 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
102f0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
10300 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
10310 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
10320 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
10330 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
10340 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
10350 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
10360 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
10370 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
10380 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
10390 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
103a0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
103b0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
103c0 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65  ab = 0; /* Table
103d0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
103e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
103f0 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e  x = 0; /* The in
10400 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
10410 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
10420 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
10430 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
10440 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74  Id;    /* Fake t
10450 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
10460 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
10470 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
10480 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
10490 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
104a0 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
104b0 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20  nt isTemp;      
104c0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74 65  /* True for a te
104d0 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f  mporary index */
104e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
104f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
10500 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
10510 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
10520 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
10530 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
10540 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10550 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61  me = 0; /* Unqua
10560 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
10570 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
10580 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  te */..  if( pPa
10590 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
105a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
105b0 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
105c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
105d0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
105e0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
105f0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
10600 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
10610 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
10620 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
10630 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
10640 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
10650 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
10660 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
10670 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
10680 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
10690 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
106a0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
106b0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
106c0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
106d0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
106e0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
106f0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
10700 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
10710 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
10720 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
10730 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
10740 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
10750 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10760 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ex;..    /* If t
10770 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
10780 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
10790 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20  heck if the the 
107a0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
107b0 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
107c0 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
107d0 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20  abase to 1..    
107e0 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  */.    pTab = sq
107f0 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
10800 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
10810 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ame);.    if( pN
10820 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
10830 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
10840 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a  pTab->iDb==1 ){.
10850 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
10860 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
10870 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
10880 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
10890 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
108a0 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
108b0 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
108c0 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
108d0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
108e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
108f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  ex;.    }.    pT
10900 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
10910 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
10920 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
10930 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
10940 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
10950 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
10960 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
10970 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10980 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
10990 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
109a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
109b0 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
109c0 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
109d0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
109e0 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e      iDb = pTab->
109f0 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  iDb;.  }..  if( 
10a00 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
10a10 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
10a20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10a30 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
10a40 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
10a50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10a60 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
10a70 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
10a80 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
10a90 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
10aa0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10ab0 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   }.  if( pTab->p
10ac0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
10ad0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10ae0 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
10af0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
10b00 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
10b10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10b20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54   }.  isTemp = pT
10b30 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f  ab->iDb==1;..  /
10b40 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
10b50 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
10b60 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
10b70 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
10b80 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
10b90 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
10ba0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
10bb0 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
10bc0 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
10bd0 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
10be0 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
10bf0 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
10c00 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
10c10 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
10c20 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
10c30 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
10c40 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
10c50 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
10c60 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
10c70 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
10c80 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
10c90 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
10ca0 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
10cb0 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
10cc0 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
10cd0 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
10ce0 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
10cf0 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
10d00 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
10d10 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
10d20 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
10d30 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
10d40 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
10d50 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
10d60 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
10d70 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
10d80 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
10d90 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  n(pName);.    if
10da0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
10db0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
10dc0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
10dd0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10de0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
10df0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10e00 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10e10 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
10e20 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
10e30 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
10e40 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
10e50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10e60 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
10e70 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
10e80 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  sy ){.      Inde
10e90 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20  x *pISameName;  
10ea0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64    /* Another ind
10eb0 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ex with the same
10ec0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
10ed0 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65  able *pTSameName
10ee0 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;    /* A table 
10ef0 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
10f00 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  s the index */. 
10f10 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
10f20 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
10f30 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
10f40 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10f50 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66  _index;.      if
10f60 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pISameName = 
10f70 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
10f80 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
10f90 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 29  aDb[iDb].zName))
10fa0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
10fb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10fc0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
10fd0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
10fe0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
10ff0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
11000 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
11010 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 53  }.      if( (pTS
11020 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ameName = sqlite
11030 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
11040 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a  Name, 0))!=0 ){.
11050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11060 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11070 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
11080 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
11090 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
110a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
110b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
110c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
110d0 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20  se if( pName==0 
110e0 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
110f0 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  [30];.    int n;
11100 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
11110 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
11120 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
11130 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
11140 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
11150 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74  ++){}.    sprint
11160 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b  f(zBuf,"_%d",n);
11170 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
11180 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
11190 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71  ring(&zName, "sq
111a0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
111b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
111c0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
111d0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
111e0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
111f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
11200 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
11210 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
11220 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
11230 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
11240 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
11250 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
11260 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
11270 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
11280 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
11290 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
112a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
112b0 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
112c0 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
112d0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
112e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
112f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11300 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
11310 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
11320 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
11330 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
11340 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
11350 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11360 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
11370 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
11380 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
11390 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
113a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
113b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
113c0 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
113d0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
113e0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
113f0 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
11400 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
11410 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
11420 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
11430 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
11440 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
11450 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
11460 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
11470 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
11480 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
11490 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
114a0 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
114b0 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
114c0 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
114d0 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
114e0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
114f0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
11500 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20  , 0, &nullId);. 
11510 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
11520 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11530 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
11540 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
11550 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
11560 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
11570 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d  pIndex = sqliteM
11580 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e  alloc( sizeof(In
11590 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  dex) + strlen(zN
115a0 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20  ame) + 1 +.     
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 20     (sizeof(int) 
115d0 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  + sizeof(CollSeq
115e0 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72  *))*pList->nExpr
115f0 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78   );.  if( pIndex
11600 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11610 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11620 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
11630 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78   = (int*)&pIndex
11640 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11650 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20  pList->nExpr];. 
11660 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
11670 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
11680 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d  >aiColumn[pList-
11690 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72 63 70  >nExpr];.  strcp
116a0 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
116b0 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
116c0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
116d0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
116e0 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
116f0 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
11700 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
11710 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
11720 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
11730 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d  .  pIndex->iDb =
11740 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e   iDb;..  /* Scan
11750 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
11760 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
11770 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
11780 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
11790 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
117a0 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
117b0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
117c0 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
117d0 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
117e0 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
117f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
11800 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
11810 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
11820 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
11830 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
11840 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11850 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
11860 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
11870 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
11880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11890 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
118a0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
118b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
118c0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
118d0 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
118e0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
118f0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74  ab->zName, pList
11900 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
11910 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11920 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11930 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
11940 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
11950 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
11960 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  [i].pExpr ){.   
11970 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
11980 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43  ->a[i].pExpr->pC
11990 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e  oll );.      pIn
119a0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
119b0 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61  ll[i] = pList->a
119c0 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  [i].pExpr->pColl
119d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
119e0 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e     pIndex->keyIn
119f0 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54  fo.aColl[i] = pT
11a00 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c  ab->aCol[j].pCol
11a10 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  l;.    }.    ass
11a20 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79  ert( pIndex->key
11a30 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b  Info.aColl[i] );
11a40 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
11a50 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20  it.busy && .    
11a60 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
11a70 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11a80 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
11a90 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29  aColl[i]) .    )
11aa0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11ab0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11ac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64      }.  }.  pInd
11ad0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65  ex->keyInfo.nFie
11ae0 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ld = pList->nExp
11af0 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  r;..  if( pTab==
11b00 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11b10 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
11b20 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
11b30 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
11b40 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
11b50 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
11b60 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
11b70 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
11b80 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
11b90 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
11ba0 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
11bb0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
11bc0 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
11bd0 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
11be0 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
11bf0 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
11c00 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
11c10 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
11c20 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
11c30 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
11c40 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
11c50 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
11c60 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
11c70 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
11c80 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
11c90 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
11ca0 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
11cb0 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
11cc0 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
11cd0 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
11ce0 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
11cf0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
11d00 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
11d10 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
11d20 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
11d30 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
11d40 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
11d50 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
11d60 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
11d70 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
11d80 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
11d90 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
11da0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
11db0 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
11dc0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
11dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
11de0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
11df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
11e00 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
11e10 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
11e20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
11e30 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
11e40 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
11e50 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
11e60 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
11e70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11e80 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
11e90 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
11ea0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
11eb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
11ec0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
11ed0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79  [k]!=pIndex->key
11ee0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20  Info.aColl[k] ) 
11ef0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
11f00 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
11f10 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
11f20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
11f30 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
11f40 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
11f50 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
11f60 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
11f70 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
11f80 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
11f90 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
11fa0 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
11fb0 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
11fc0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
11fd0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
11fe0 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
11ff0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
12000 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
12010 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
12020 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
12030 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
12040 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
12050 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
12060 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
12070 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
12080 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
12090 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
120a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
120b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
120c0 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
120d0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
120e0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
120f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
12100 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
12110 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
12120 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
12130 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
12140 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
12150 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12160 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12180 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
12190 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
121a0 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
121b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
121c0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
121d0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
121e0 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
121f0 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
12200 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
12210 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
12220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12230 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12240 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
12250 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
12260 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
12270 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
12280 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
12290 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
122a0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
122b0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
122c0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
122d0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
122e0 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
122f0 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
12300 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
12310 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48  Index->iDb].idxH
12320 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12340 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74  Index->zName, st
12350 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rlen(pIndex->zNa
12360 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a  me)+1, pIndex);.
12370 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
12380 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
12390 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
123a0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
123b0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  led */.      got
123c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
123d0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
123e0 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
123f0 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
12400 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
12410 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  me!=0 ){.      p
12420 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
12430 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
12440 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12450 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
12460 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
12470 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
12480 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
12490 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
124a0 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
124b0 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
124c0 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
124d0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
124e0 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
124f0 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
12500 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
12510 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
12520 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
12530 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
12540 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
12550 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
12560 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
12570 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
12580 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
12590 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
125a0 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
125b0 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
125c0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
125d0 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
125e0 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
125f0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
12600 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
12610 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
12620 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
12630 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
12640 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
12650 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
12660 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
12670 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
12680 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
12690 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
126a0 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
126b0 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
126c0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
126d0 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
126e0 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
126f0 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
12700 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
12710 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
12720 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
12730 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
12740 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
12750 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  sy==0 ){.    Vdb
12760 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
12770 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
12780 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
12790 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73  em++;..    v = s
127a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
127b0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
127c0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
127d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
127e0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
127f0 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
12800 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
12810 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
12820 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
12830 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
12840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12850 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
12860 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a  Index, iDb, 0);.
12870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12880 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
12890 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a  ore, iMem, 0);..
128a0 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
128b0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
128c0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
128d0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
128e0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
128f0 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
12900 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
12910 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
12920 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
12930 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
12940 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
12950 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
12960 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
12970 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52  lite3MPrintf("CR
12980 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
12990 71 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72  q",.        onEr
129a0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
129b0 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20  " : " UNIQUE",. 
129c0 20 20 20 20 20 20 20 41 64 64 72 28 70 45 6e 64         Addr(pEnd
129d0 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61 6d  ->z) - Addr(pNam
129e0 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20 20  e->z) + 1,.     
129f0 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20     pName->z);.  
12a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12a10 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
12a20 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
12a30 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
12a40 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12a50 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
12a60 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
12a70 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
12a80 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
12a90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
12aa0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
12ab0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
12ac0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
12ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
12ae0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
12af0 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
12b00 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
12b10 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
12b20 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  ,#0,%Q);",.     
12b30 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
12b40 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
12b50 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
12b60 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
12b70 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
12b80 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53  Name,.        zS
12b90 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
12ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12bb0 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
12bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12bd0 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a  (zStmt);..    /*
12be0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
12bf0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
12c00 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
12c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12c20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
12c30 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
12c40 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
12c50 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
12c60 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
12c70 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
12c80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12c90 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
12ca0 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
12cb0 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
12cc0 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65  te3MPrintf("name
12cd0 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
12ce0 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
12cf0 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  IC);.    }.  }..
12d00 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
12d10 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
12d20 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
12d30 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
12d40 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
12d50 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
12d60 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
12d70 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
12d80 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
12d90 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
12da0 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
12db0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
12dc0 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
12dd0 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
12de0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
12df0 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
12e00 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
12e10 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
12e20 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
12e30 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
12e40 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
12e50 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
12e60 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
12e70 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
12e80 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
12e90 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
12ea0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
12eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
12ec0 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
12ed0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
12ee0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
12ef0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
12f00 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
12f10 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
12f20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
12f30 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
12f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
12f50 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
12f60 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
12f70 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
12f80 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
12f90 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
12fa0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
12fb0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
12fc0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
12fd0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
12fe0 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65  ndex ){.    free
12ff0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
13000 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
13010 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
13020 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
13030 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61  istDelete(pTblNa
13040 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
13050 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
13060 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
13070 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
13080 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
13090 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
130a0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
130b0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
130c0 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
130d0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
130e0 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
130f0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
13100 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
13110 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
13120 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
13130 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13140 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
13150 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
13160 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
13170 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
13180 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
13190 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
131a0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
131b0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
131c0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49  ) ) return;.  pI
131d0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
131e0 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
131f0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
13200 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13210 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
13220 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
13230 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13240 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
13250 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
13260 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
13270 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
13280 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
13290 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
132a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
132b0 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
132c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
132d0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
132e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
132f0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
13300 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
13310 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
13320 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
13330 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13340 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
13350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13360 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13370 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
13380 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13390 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
133a0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
133b0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
133c0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
133d0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
133e0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
133f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
13400 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
13410 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
13420 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13430 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13440 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
13450 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
13460 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13470 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
13480 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
13490 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
134a0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
134b0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
134c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
134d0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
134e0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
134f0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
13500 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13510 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
13520 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13530 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13540 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
13550 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
13560 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
13570 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
13580 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13590 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
135a0 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d  nt iDb = pIndex-
135b0 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
135c0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
135d0 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
135e0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
135f0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
13600 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
13610 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
13620 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
13630 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
13640 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
13650 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
13660 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
13670 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
13680 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
13690 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
136a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
136b0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
136c0 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78  , iDb, 0, pIndex
136d0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
136e0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
136f0 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
13700 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
13710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
13720 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
13730 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
13740 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
13750 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
13760 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
13770 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
13780 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
13790 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
137a0 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
137b0 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
137c0 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
137d0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
137e0 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
137f0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
13800 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
13810 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
13820 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
13830 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
13840 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
13850 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
13860 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d  ist->nId>=pList-
13870 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73  >nAlloc ){.    s
13880 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
13890 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d  m *a;.    pList-
138a0 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d  >nAlloc = pList-
138b0 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20  >nAlloc*2 + 5;. 
138c0 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
138d0 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
138e0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
138f0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
13900 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
13910 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13920 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
13930 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
13940 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
13950 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
13960 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73  }.  memset(&pLis
13970 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
13980 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
13990 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69  t->a[0]));.  pLi
139a0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
139b0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
139c0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
139d0 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d  Token);.  pList-
139e0 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
139f0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
13a00 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
13a10 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
13a20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
13a30 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
13a40 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
13a50 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
13a60 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
13a70 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
13a80 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
13a90 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
13aa0 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
13ab0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
13ac0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
13ad0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
13ae0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
13af0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13b00 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
13b10 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
13b20 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
13b30 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
13b40 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
13b50 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
13b60 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
13b70 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
13b80 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
13b90 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13ba0 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
13bb0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
13bc0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
13bd0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
13be0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
13bf0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
13c00 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
13c10 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
13c20 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
13c30 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
13c40 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
13c50 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
13c60 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
13c70 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
13c80 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
13c90 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
13ca0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
13cb0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
13cc0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
13cd0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
13ce0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
13cf0 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
13d00 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
13d10 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
13d20 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
13d30 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
13d40 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
13d50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
13d60 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
13d70 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
13d80 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
13d90 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
13da0 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
13db0 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
13dc0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
13dd0 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73  istAppend(SrcLis
13de0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
13df0 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a  *pTable, Token *
13e00 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74  pDatabase){.  st
13e10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13e20 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
13e30 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
13e40 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
13e50 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63  lloc( sizeof(Src
13e60 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
13e70 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13e80 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
13e90 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d  >nAlloc = 1;.  }
13ea0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53  .  if( pList->nS
13eb0 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rc>=pList->nAllo
13ec0 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
13ed0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73   *pNew;.    pLis
13ee0 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
13ef0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
13f00 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a  eRealloc(pList,.
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13f20 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
13f30 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
13f40 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
13f50 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
13f60 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
13f70 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
13f80 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
13f90 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
13fa0 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
13fb0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74   pNew;.  }.  pIt
13fc0 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
13fd0 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d  List->nSrc];.  m
13fe0 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
13ff0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
14000 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
14010 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
14020 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
14030 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
14040 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
14050 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
14060 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
14070 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
14080 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
14090 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
140a0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
140b0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
140c0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
140d0 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70  ken(pTable);.  p
140e0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
140f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14100 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65  mToken(pDatabase
14110 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72  );.  pItem->iCur
14120 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73  sor = -1;.  pLis
14130 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74  t->nSrc++;.  ret
14140 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
14150 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f  .** Assign curso
14160 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
14170 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
14180 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
14190 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
141a0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
141b0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
141c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
141d0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
141e0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Src; i++){.    i
141f0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  f( pList->a[i].i
14200 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20  Cursor<0 ){.    
14210 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43    pList->a[i].iC
14220 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
14230 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nTab++;.    }.  
14240 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
14250 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c  n alias to the l
14260 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f  ast identifier o
14270 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e  n the given iden
14280 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a  tifier list..*/.
14290 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
142a0 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
142b0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
142c0 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
142d0 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
142e0 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
142f0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
14300 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d  nSrc-1].zAlias =
14310 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
14320 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
14330 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
14340 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
14350 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
14360 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
14370 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
14380 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
14390 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
143a0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
143b0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
143c0 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
143d0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
143e0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
143f0 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
14400 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
14410 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14420 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
14430 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
14440 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
14450 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
14460 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
14470 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
14480 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
14490 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
144a0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
144b0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
144c0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
144d0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
144e0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
144f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
14500 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
14510 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
14520 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
14530 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
14540 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
14550 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
14560 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
14570 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
14580 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
14590 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c  cListDelete(SrcL
145a0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
145b0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
145c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
145d0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
145e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
145f0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
14600 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
14610 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
14620 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
14630 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74  Free(pItem->zDat
14640 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
14650 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e  teFree(pItem->zN
14660 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
14670 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69  Free(pItem->zAli
14680 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  as);.    if( pIt
14690 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49 74 65  em->pTab && pIte
146a0 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m->pTab->isTrans
146b0 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
146c0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
146d0 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  (0, pItem->pTab)
146e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
146f0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
14700 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
14710 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
14720 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f  Delete(pItem->pO
14730 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
14740 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65  dListDelete(pIte
14750 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
14760 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
14770 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
14780 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
14790 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
147a0 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
147b0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
147c0 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
147d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
147e0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
147f0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
14800 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
14810 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
14820 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
14830 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
14840 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
14850 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
14860 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14870 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14880 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14890 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
148a0 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
148b0 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
148c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
148d0 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
148e0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
148f0 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
14900 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
14910 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14920 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14930 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
14940 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
14950 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
14960 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  VE)+1);.    }.  
14970 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
14980 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
14990 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
149a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
149b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
149c0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
149d0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
149e0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
149f0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
14a00 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
14a10 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
14a20 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
14a30 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
14a40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
14a50 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
14a60 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14a70 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
14a80 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
14a90 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14aa0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
14ab0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
14ac0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
14ad0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
14ae0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14af0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
14b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14b10 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
14b20 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
14b30 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
14b40 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
14b50 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
14b60 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
14b70 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14b80 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14b90 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
14ba0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14bb0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14bc0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14bd0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14be0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14bf0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14c00 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14c10 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14c20 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14c30 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14c40 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
14c50 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
14c60 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
14c70 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14c80 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
14c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14ca0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
14cb0 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
14cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14cd0 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
14ce0 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
14cf0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
14d00 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
14d10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
14d20 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
14d30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
14d40 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
14d50 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
14d60 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  c int sqlite3Ope
14d70 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
14d80 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14d90 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14da0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
14db0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
14dc0 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
14dd0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
14de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14df0 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
14e00 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26   0, MAX_PAGES, &
14e10 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
14e20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14e40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14e50 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
14e60 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
14e70 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
14e80 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
14e90 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
14ea0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
14eb0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
14ec0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
14ed0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
14ee0 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
14ef0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
14f00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14f10 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
14f20 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
14f30 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
14f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14f50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14f60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14f70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
14f80 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
14f90 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
14fa0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
14fb0 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
14fc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
14fd0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
14fe0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
14ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15000 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
15010 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
15020 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
15030 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
15040 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
15050 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
15060 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
15070 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
15080 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
15090 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
150a0 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
150b0 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
150c0 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
150d0 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
150e0 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
150f0 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
15100 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
15110 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
15120 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
15130 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
15140 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
15150 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
15160 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
15170 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
15180 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
15190 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
151a0 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
151b0 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
151c0 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
151d0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
151e0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
151f0 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
15200 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
15210 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
15220 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
15230 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
15240 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
15250 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
15260 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
15270 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
15280 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
15290 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
152a0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
152b0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
152c0 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
152d0 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
152e0 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
152f0 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
15300 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
15310 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
15320 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
15330 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
15340 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
15350 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
15360 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
15370 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
15380 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
15390 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
153a0 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
153b0 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
153c0 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
153d0 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
153e0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
153f0 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
15400 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
15410 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
15420 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
15430 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
15440 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
15450 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
15460 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
15470 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
15480 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
15490 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
154a0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
154b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
154c0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
154d0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
154e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
154f0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
15500 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
15510 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
15520 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
15530 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
15540 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
15550 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
15560 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
15570 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
15580 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
15590 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
155a0 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
155b0 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
155c0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
155d0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
155e0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
155f0 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
15600 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
15610 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 20  t( iDb<32 );.   
15620 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
15630 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
15640 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
15650 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
15660 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
15670 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
15680 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15690 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
156a0 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
156b0 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
156c0 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
156d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
156e0 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
156f0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
15700 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15710 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
15720 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
15730 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
15740 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
15750 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
15760 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
15770 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
15780 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
15790 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
157a0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
157b0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
157c0 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
157d0 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
157e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
157f0 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
15800 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
15810 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
15820 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
15830 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
15840 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
15850 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
15860 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
15870 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
15880 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
15890 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
158a0 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
158b0 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
158c0 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
158d0 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
158e0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
158f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
15900 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
15910 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
15920 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
15930 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
15940 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
15950 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
15960 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
15970 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
15980 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
15990 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
159a0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
159b0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
159c0 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
159d0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
159e0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
159f0 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
15a00 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
15a10 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
15a20 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
15a30 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
15a40 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
15a50 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
15a60 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
15a70 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
15a80 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
15a90 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
15aa0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
15ab0 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
15ac0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
15ad0 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
15ae0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
15af0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
15b00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15b10 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
15b20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
15b30 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
15b40 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15b50 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
15b60 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
15b70 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
15b80 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
15b90 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
15ba0 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
15bb0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20  setStatement && 
15bc0 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
15bd0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15be0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15bf0 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20  Statement, iDb, 
15c00 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  0);.  }.  if( iD
15c10 62 21 3d 31 20 26 26 20 70 50 61 72 73 65 2d 3e  b!=1 && pParse->
15c20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d  db->aDb[1].pBt!=
15c30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15c40 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
15c50 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53  ion(pParse, setS
15c60 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20  tatement, 1);.  
15c70 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  }.}../* .** Retu
15c80 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  rn the transient
15c90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
15ca0 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65  bject used for e
15cb0 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69  ncoding conversi
15cc0 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51  ons.** during SQ
15cd0 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a  L compilation..*
15ce0 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
15cf0 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73  *sqlite3GetTrans
15d00 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65  ientValue(sqlite
15d10 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64  3 *db){.  if( !d
15d20 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20  b->pValue ){.   
15d30 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71   db->pValue = sq
15d40 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
15d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
15d60 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 0a 2f 2a 0a  ->pValue;.}../*.
15d70 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
15d80 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
15d90 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
15da0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
15db0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
15dc0 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
15dd0 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
15de0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
15df0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
15e00 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
15e10 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c 6c 53  ationMatch(CollS
15e20 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64 65 78  eq *pColl, Index
15e30 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
15e40 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79   n = pIndex->key
15e50 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20 20 43  Info.nField;.  C
15e60 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20 70 49  ollSeq **pp = pI
15e70 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
15e80 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  oll;.  while( n-
15e90 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 70 70  - ){.    if( *pp
15ea0 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e  ==pColl ) return
15eb0 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a 20 20   1;.    pp++;.  
15ec0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15ed0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15ee0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
15ef0 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
15f00 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
15f10 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
15f20 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
15f30 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
15f40 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
15f50 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
15f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
15f70 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e 64 65  NDEX.void reinde
15f80 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
15f90 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
15fa0 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  b, CollSeq *pCol
15fb0 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
15fc0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
15fd0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
15fe0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
15ff0 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
16000 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
16010 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
16020 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
16030 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
16040 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
16050 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65 78  tch(pColl,pIndex
16060 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
16070 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
16080 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
16090 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
160a0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
160b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
160c0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
160d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
160e0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
160f0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
16100 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
16110 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
16120 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
16130 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
16140 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
16150 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
16160 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
16170 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
16180 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
16190 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
161a0 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e  EINDEX.void rein
161b0 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
161c0 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
161d0 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44  Seq *pColl){.  D
161e0 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
161f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16200 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
16210 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16240 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
16250 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16260 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
16270 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16280 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
16290 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
162a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
162b0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
162c0 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
162d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162f0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
16300 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66  database */..  f
16310 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
16320 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
16330 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
16340 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d  ){.    if( pDb==
16350 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
16360 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
16370 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
16380 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
16390 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
163a0 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
163b0 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
163c0 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
163d0 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
163e0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f  Parse, pTab, pCo
163f0 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
16400 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
16410 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16420 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
16430 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
16440 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
16470 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
16480 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
16490 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
164a0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
164b0 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
164c0 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
164d0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
164e0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
164f0 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
16500 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
16510 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
16520 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
16530 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
16540 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
16550 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
16560 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
16570 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
16580 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
16590 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
165a0 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
165b0 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
165c0 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
165d0 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
165e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
165f0 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
16600 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16610 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
16620 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
16630 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16640 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
16650 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
16660 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16680 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
16690 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
166a0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
166b0 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
166d0 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
166e0 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
166f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
16700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16710 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
16720 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
16730 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
16740 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
16750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
16760 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
16770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16780 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
16790 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
167a0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
167d0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
167e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
167f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
16800 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16810 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
16820 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
16830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16840 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
16850 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
16860 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69  eindexed */..  i
16870 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20  f( pName1==0 || 
16880 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName1->z==0 ){.
16890 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
168a0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
168b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
168c0 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d  else if( pName2=
168d0 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  =0 || pName2->z=
168e0 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
168f0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
16900 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65 6e 63  lSeq(db, db->enc
16910 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61  , pName1->z, pNa
16920 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  me1->n, 0);.    
16930 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
16940 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
16950 73 65 73 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  ses(pParse, pCol
16960 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
16970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44  ;.    }.  }.  iD
16980 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
16990 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
169a0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
169b0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
169c0 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
169d0 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
169e0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a  meFromToken(pObj
169f0 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64  Name);.  zDb = d
16a00 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
16a10 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
16a20 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
16a30 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
16a40 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
16a50 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
16a60 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
16a70 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
16a80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
16a90 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
16aa0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
16ab0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46   zDb);.  sqliteF
16ac0 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49  ree(z);.  if( pI
16ad0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
16ae0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16af0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
16b00 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16b10 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
16b20 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
16b30 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
16b40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
16b50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
16b60 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
16b70 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
16b80 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
16b90 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.