/ Hex Artifact Content
Login

Artifact cbd985e9d0168204fcca3e1123f0b7f621f402e6:


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 37 20 32 30 30 34 2f 31 31 2f 31 32  1.277 2004/11/12
02f0: 20 31 33 3a 34 32 3a 33 31 20 64 61 6e 69 65 6c   13:42:31 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 70 44 62 2d 3e 70 53 65  1);.    pDb->pSe
2980: 71 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 44 62  qTab = 0;.    Db
2990: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
29a0: 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , i, DB_SchemaLo
29b0: 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69  aded);.    if( i
29c0: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
29d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
29e0: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
29f0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
2a00: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20  ternChanges;..  
2a10: 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  /* If one or mor
2a20: 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61  e of the auxilia
2a30: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2a40: 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  s has been close
2a50: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d  d,.  ** then rem
2a60: 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68  ove then from th
2a70: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2a80: 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74  base list.  We t
2a90: 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70  ake the.  ** opp
2aa0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74  ortunity to do t
2ab0: 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77  his here since w
2ac0: 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65  e have just dele
2ad0: 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20  ted all of the. 
2ae0: 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20   ** schema hash 
2af0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65  tables and there
2b00: 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  fore do not have
2b10: 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61   to make any cha
2b20: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79  nges.  ** to any
2b30: 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73   of those tables
2b40: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2b50: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2b60: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
2b70: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
2b80: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
2b90: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
2ba0: 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20    if( pDb->pAux 
2bb0: 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78  && pDb->xFreeAux
2bc0: 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78   ) pDb->xFreeAux
2bd0: 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20  (pDb->pAux);.   
2be0: 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30     pDb->pAux = 0
2bf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
2c00: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
2c10: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
2c20: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
2c30: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2c40: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
2c50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
2c60: 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  ree(pDb->zName);
2c70: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
2c80: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
2c90: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
2ca0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
2cb0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
2cc0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
2cd0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
2ce0: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
2cf0: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
2d00: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
2d10: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
2d20: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
2d30: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
2d40: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
2d50: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
2d60: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
2d70: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
2d80: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
2d90: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
2da0: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
2db0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
2dc0: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
2dd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2de0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
2df0: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
2e00: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
2e10: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
2e20: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
2e30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2e40: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
2e50: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
2e60: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
2e70: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
2e80: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
2e90: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
2ea0: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
2eb0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
2ec0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
2ed0: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
2ee0: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
2ef0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2f00: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
2f10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2f20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2f30: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
2f40: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
2f50: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
2f60: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2f70: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2f80: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
2f90: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2fa0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  es;.}../*.** Cle
2fb0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
2fc0: 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  mes from a table
2fd0: 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61   or view..*/.sta
2fe0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52  tic void sqliteR
2ff0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3000: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3010: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
3020: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
3030: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
3040: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
3050: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c  pTable->aCol; i<
3060: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
3070: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
3080: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
3090: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
30a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
30b0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
30c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
30d0: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  ->zType);.  }.  
30e0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
30f0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62  e->aCol);.  pTab
3100: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3110: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
3120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
3130: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74  e the memory dat
3140: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  a structures ass
3150: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3160: 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e   given.** Table.
3170: 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65    No changes are
3180: 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79   made to disk by
3190: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
31a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
31b0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74  e just deletes t
31c0: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
31d0: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
31e0: 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61  unlink.** the ta
31f0: 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ble data structu
3200: 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  re from the hash
3210: 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65   table.  Nor doe
3220: 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66  s it remove.** f
3230: 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d  oreign keys from
3240: 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65   the sqlite.aFKe
3250: 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  y hash table.  B
3260: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
3270: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
3280: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
3290: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
32a0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
32b0: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
32c0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64  table..**.** Ind
32d0: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
32e0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61  with the table a
32f0: 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  re unlinked from
3300: 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74   the "db".** dat
3310: 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64  a structure if d
3320: 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d  b!=NULL.  If db=
3330: 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61  =NULL, indices a
3340: 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68  ttached to.** th
3350: 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65  e table are dele
3360: 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61  ted, but it is a
3370: 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65  ssumed they have
3380: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
3390: 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f   unlinked..*/.vo
33a0: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
33b0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
33c0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
33d0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
33e0: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b  ex, *pNext;.  FK
33f0: 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78  ey *pFKey, *pNex
3400: 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54  tFKey;..  if( pT
3410: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
3420: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
3430: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
3440: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
3450: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  table.  */.  for
3460: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
3470: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
3480: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
3490: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
34a0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
34b0: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
34c0: 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62  iDb==pTable->iDb
34d0: 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62   || (pTable->iDb
34e0: 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  ==0 && pIndex->i
34f0: 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71  Db==1) );.    sq
3500: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
3510: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
3520: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
3530: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
3540: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3550: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
3560: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
3570: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3580: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
3590: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
35a0: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
35b0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
35c0: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
35d0: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
35e0: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
35f0: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
3600: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
3610: 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62  ( pTable->iDb<db
3620: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
3630: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
3640: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54  Find(&db->aDb[pT
3650: 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  able->iDb].aFKey
3660: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
3680: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
3690: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
36a0: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
36b0: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
36c0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
36d0: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
36e0: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
36f0: 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43  /.  sqliteResetC
3700: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c  olumnNames(pTabl
3710: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3720: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  (pTable->zName);
3730: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3740: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
3750: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3760: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
3770: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
3780: 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a  Free(pTable);.}.
3790: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
37a0: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
37b0: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
37c0: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
37d0: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
37e0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
37f0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
3800: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
3810: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
3820: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
3830: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
3840: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
3850: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
3860: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46  .  Table *p;.  F
3870: 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a  Key *pF1, *pF2;.
3880: 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
3890: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
38a0: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
38b0: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
38c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
38d0: 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65  Name && zTabName
38e0: 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  [0] );.  pDb = &
38f0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
3900: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
3910: 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48  nsert(&pDb->tblH
3920: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73  ash, zTabName, s
3930: 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b  trlen(zTabName)+
3940: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29  1, 0);.  if( p )
3950: 7b 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d  {.    for(pF1=p-
3960: 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31  >pFKey; pF1; pF1
3970: 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pF1->pNextFrom)
3980: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20  {.      int nTo 
3990: 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54  = strlen(pF1->zT
39a0: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
39b0: 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  2 = sqlite3HashF
39c0: 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c  ind(&pDb->aFKey,
39d0: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b   pF1->zTo, nTo);
39e0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d  .      if( pF2==
39f0: 70 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pF1 ){.        s
3a00: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3a10: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
3a20: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31  1->zTo, nTo, pF1
3a30: 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20  ->pNextTo);.    
3a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3a50: 20 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70   while( pF2 && p
3a60: 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31  F2->pNextTo!=pF1
3a70: 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65   ){ pF2=pF2->pNe
3a80: 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20  xtTo; }.        
3a90: 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20  if( pF2 ){.     
3aa0: 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54       pF2->pNextT
3ab0: 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  o = pF1->pNextTo
3ac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3ad0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
3ae0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
3af0: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 64  (db, p);.  }.  d
3b00: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
3b10: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
3b30: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
3b40: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
3b50: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
3b60: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
3b70: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
3b80: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
3b90: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
3ba0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
3bb0: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
3bc0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
3bd0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
3be0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
3bf0: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
3c00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
3c10: 6e 73 20 61 72 65 20 72 65 61 6c 6c 79 20 6a 75  ns are really ju
3c20: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
3c30: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
3c40: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
3c50: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
3c60: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
3c70: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
3c80: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
3c90: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
3ca0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
3cb0: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
3cc0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
3cd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b  ameFromToken(Tok
3ce0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
3cf0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
3d00: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
3d10: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
3d20: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
3d30: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
3d40: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
3d50: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
3d60: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
3d70: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
3d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
3d90: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
3da0: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
3db0: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
3dc0: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
3dd0: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
3de0: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
3df0: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
3e00: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
3e10: 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20  rTable(Vdbe *v, 
3e20: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
3e30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3e40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
3e50: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3e60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
3e70: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
3e80: 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69  ER_ROOT);.  sqli
3e90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ea0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
3eb0: 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69  , 0, 5); /* sqli
3ec0: 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20  te_master has 5 
3ed0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a  columns */.}../*
3ee0: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
3ef0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
3f00: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
3f10: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
3f20: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
3f30: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
3f40: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
3f50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
3f60: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
3f70: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
3f80: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
3f90: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
3fa0: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
3fb0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
3fc0: 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28 73  .*/.int findDb(s
3fd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
3fe0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
3ff0: 20 69 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20   i;.  Db *pDb;. 
4000: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
4010: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4020: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 6e  ken(pName);.  in
4030: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  t n = strlen(zNa
4040: 6d 65 29 3b 0a 20 20 66 6f 72 28 70 44 62 3d 64  me);.  for(pDb=d
4050: 62 2d 3e 61 44 62 2c 20 69 3d 30 3b 20 69 3c 64  b->aDb, i=0; i<d
4060: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 2c 20 70 44 62  b->nDb; i++, pDb
4070: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  ++){.    if( n==
4080: 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d  strlen(pDb->zNam
4090: 65 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  e) && 0==sqlite3
40a0: 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  StrICmp(pDb->zNa
40b0: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  me, zName) ){.  
40c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
40d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
40e0: 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn i;.    }.  }
40f0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
4100: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 2d  ame);.  return -
4110: 31 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  1;.}../* The tab
4120: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
4130: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
4140: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
4150: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
4160: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
4170: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
4180: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
4190: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
41a0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
41b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
41c0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
41d0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
41e0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
41f0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
4200: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
4210: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
4220: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
4230: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4240: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
4250: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
4260: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
4270: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4280: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
4290: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
42a0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
42b0: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
42c0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
42d0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
42e0: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
42f0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
4300: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
4310: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
4320: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
4330: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
4340: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
4350: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
4360: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
4370: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
4380: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
4390: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
43a0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
43b0: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
43c0: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
43d0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
43e0: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
43f0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
4400: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
4410: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
4420: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
4430: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
4440: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
4450: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
4460: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
4470: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4490: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
44a0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
44b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
44c0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
44d0: 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
44e0: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  >n>0 ){.    asse
44f0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
4500: 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75  sy );.    *pUnqu
4510: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
4520: 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64 62   iDb = findDb(db
4530: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
4540: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
4550: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4560: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
4570: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
4580: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
4590: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
45a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
45b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
45c0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
45d0: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
45e0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
45f0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
4600: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
4610: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
4620: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
4630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4640: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
4650: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
4660: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
4670: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
4680: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
4690: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
46a0: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
46b0: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
46c0: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
46d0: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
46e0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
46f0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
4700: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
4710: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
4720: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
4730: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
4740: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
4750: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
4760: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
4770: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
4780: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
4790: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
47a0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
47b0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
47c0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
47d0: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
47e0: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
47f0: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
4800: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
4810: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
4820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4830: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4840: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
4850: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
4860: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
4870: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
4880: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
4890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
48a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  OK;.}../*.** Beg
48b0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
48c0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
48d0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
48e0: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
48f0: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
4900: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
4910: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
4920: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
4930: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
4940: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4950: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
4960: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
4970: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
4980: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
4990: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
49a0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
49b0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a  ble name.  The.*
49c0: 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69  * pStart token i
49d0: 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64  s the CREATE and
49e0: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61   pName is the ta
49f0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4a00: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
4a10: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
4a20: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
4a30: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
4a40: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
4a50: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
4a60: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
4a70: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
4a80: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
4a90: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
4aa0: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
4ab0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
4ac0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
4ad0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
4ae0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
4af0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
4b00: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
4b10: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
4b20: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
4b30: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
4b40: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
4b50: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
4b60: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
4b70: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
4b80: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
4b90: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
4ba0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
4bb0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
4bc0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
4bd0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4be0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
4bf0: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
4c00: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
4c10: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
4c20: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
4c30: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
4c40: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
4c50: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
4c60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4c70: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
4c80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
4c90: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
4ca0: 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b  The "CREATE" tok
4cb0: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
4cc0: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
4cd0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
4ce0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4cf0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
4d00: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
4d10: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
4d20: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4d30: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
4d40: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
4d50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4d60: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
4d70: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
4d80: 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75  iew       /* Tru
4d90: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
4da0: 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  IEW */.){.  Tabl
4db0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64  e *pTable;.  Ind
4dc0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72  ex *pIdx;.  char
4dd0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
4de0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4df0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
4e00: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
4e10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
4e20: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
4e30: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
4e40: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
4e50: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
4e60: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
4e70: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
4e80: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
4e90: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
4ea0: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
4eb0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
4ec0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
4ed0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
4ee0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
4ef0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
4f00: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
4f10: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
4f20: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4f30: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
4f40: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
4f50: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4f60: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
4f70: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
4f80: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
4f90: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
4fa0: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
4fb0: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
4fc0: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
4fd0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
4fe0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
4ff0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5000: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5010: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
5020: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
5030: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
5040: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
5050: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
5060: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
5070: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
5080: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
5090: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
50a0: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
50b0: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
50c0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
50d0: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
50e0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
50f0: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
5100: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
5110: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
5120: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
5130: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
5140: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
5150: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
5160: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
5170: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
5180: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
5190: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
51a0: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
51b0: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
51c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
51d0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
51e0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
51f0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
5200: 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ");.    pParse->
5210: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
5220: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
5230: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
5240: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
5250: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
5260: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
5270: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
5280: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
5290: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
52a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
52b0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
52c0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
52d0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 71  zName) ){.    sq
52e0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
52f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5300: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
5310: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
5320: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
5330: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5340: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
5350: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
5360: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
5370: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
5380: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
5390: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
53a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
53b0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
53c0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
53d0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
53e0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
53f0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
5400: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  (zName);.      r
5410: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
5420: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
5430: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
5440: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
5450: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5460: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
5470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5480: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5490: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
54a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
54b0: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
54c0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
54d0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
54e0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
54f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5500: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5510: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
5520: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5530: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
5540: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
5550: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
5560: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
5570: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
5580: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
5590: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
55a0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
55b0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
55c0: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
55d0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
55e0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
55f0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
5600: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
5610: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
5620: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
5630: 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  t does..  */.  i
5640: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
5650: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
5660: 70 50 61 72 73 65 29 20 29 20 72 65 74 75 72 6e  pParse) ) return
5670: 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ;.  pTable = sql
5680: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
5690: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
56a0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
56b0: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
56c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
56d0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
56e0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
56f0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
5700: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
5710: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
5720: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
5730: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
5740: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
5750: 29 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 28  )!=0 && .      (
5760: 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e   iDb==0 || !db->
5770: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
5780: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5790: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
57a0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
57b0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
57c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
57d0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
57e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
57f0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
5800: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
5810: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
5820: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
5830: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
5840: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
5850: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5860: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
5870: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
5880: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
5890: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
58a0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
58b0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  0;.  pTable->aCo
58c0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
58d0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
58e0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
58f0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62  0;.  pTable->iDb
5900: 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50   = iDb;.  if( pP
5910: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
5920: 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  ) sqlite3DeleteT
5930: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
5940: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
5950: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5960: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
5970: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
5980: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
5990: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
59a0: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
59b0: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
59c0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
59d0: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
59e0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
59f0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
5a00: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
5a10: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
5a20: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
5a30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5a40: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
5a50: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e  .  if( strcmp(zN
5a60: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
5a70: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
5a80: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
5a90: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
5aa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
5ab0: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
5ac0: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
5ad0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
5ae0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
5af0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
5b00: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
5b10: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
5b20: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
5b30: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
5b40: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
5b50: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
5b60: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
5b70: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
5b80: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
5b90: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
5ba0: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
5bb0: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
5bc0: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
5bd0: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
5be0: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
5bf0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
5c00: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
5c10: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
5c20: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
5c30: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
5c40: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
5c50: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
5c60: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
5c70: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
5c80: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
5c90: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
5ca0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
5cb0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
5cc0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
5cd0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 45   iDb);..    /* E
5ce0: 76 65 72 79 20 74 69 6d 65 20 61 20 6e 65 77 20  very time a new 
5cf0: 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
5d00: 20 74 68 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74   the file-format
5d10: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 6e 63 6f  .    ** and enco
5d20: 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c 75 65 73  ding meta-values
5d30: 20 61 72 65 20 73 65 74 20 69 6e 20 74 68 65 20   are set in the 
5d40: 64 61 74 61 62 61 73 65 2c 20 69 6e 0a 20 20 20  database, in.   
5d50: 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 69 73   ** case this is
5d60: 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
5d70: 20 63 72 65 61 74 65 64 2e 0a 20 20 20 20 2a 2f   created..    */
5d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5d90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
5da0: 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f  ger, db->file_fo
5db0: 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  rmat, 0);.    sq
5dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5dd0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
5de0: 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  iDb, 1);.    sql
5df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5e00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
5e10: 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  >enc, 0);.    sq
5e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5e30: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
5e40: 69 44 62 2c 20 34 29 3b 0a 0a 20 20 20 20 2f 2a  iDb, 4);..    /*
5e50: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
5e60: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
5e70: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
5e80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5e90: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
5ea0: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
5eb0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5ec0: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
5ed0: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
5ee0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
5ef0: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
5f00: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
5f10: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5f20: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
5f30: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
5f40: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
5f50: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70   left on the top
5f60: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
5f70: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
5f80: 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20  value is needed 
5f90: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
5fa0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5fb0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
5fc0: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  erate..    */.  
5fd0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
5fe0: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29  terTable(v, iDb)
5ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6000: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
6010: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
6020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6030: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
6040: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6050: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6060: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
6070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6080: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
6090: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
60a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
60b0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
60c0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
60d0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
60e0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
60f0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
6100: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
6110: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
6120: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
6130: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
6140: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
6150: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
6160: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6170: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
6180: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
6190: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
61a0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
61b0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
61c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
61d0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
61e0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
61f0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
6200: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6210: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
6220: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6230: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
6240: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
6250: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
6260: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
6270: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
6280: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
6290: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
62a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
62b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
62c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
62d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
62e0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
62f0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
6300: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6310: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
6320: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
6330: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
6340: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
6350: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6360: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
6370: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
6380: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
6390: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
63a0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
63b0: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
63c0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
63d0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
63e0: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
63f0: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
6400: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
6410: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
6420: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
6430: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
6440: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6450: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
6460: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
6470: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
6480: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
6490: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
64a0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
64b0: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
64c0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
64d0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
64e0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
64f0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
6500: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
6510: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
6520: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
6530: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6540: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
6550: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
6560: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
6570: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
6580: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
6590: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
65a0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
65b0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
65c0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
65d0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
65e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
65f0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
6600: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
6610: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
6620: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
6630: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6640: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6650: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6660: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6670: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6680: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
6690: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
66a0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
66b0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
66c0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
66d0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
66e0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
66f0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6700: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
6710: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
6720: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
6730: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6740: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
6750: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
6760: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
6770: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
6780: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6790: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
67a0: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
67b0: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
67c0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
67d0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
67e0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
67f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
6800: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
6810: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
6820: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
6830: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
6840: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
6850: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
6860: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
6870: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
6880: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
6890: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
68a0: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
68b0: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
68c0: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
68d0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
68e0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
68f0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69  arse, Token *pFi
6900: 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73  rst, Token *pLas
6910: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
6920: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
6930: 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  t n;.  char *z, 
6940: 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  **pz;.  Column *
6950: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
6960: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6970: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
6980: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
6990: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
69a0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
69b0: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a  p->aCol[i];.  pz
69c0: 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b   = &pCol->zType;
69d0: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
69e0: 2b 20 28 70 4c 61 73 74 2d 3e 7a 20 2d 20 70 46  + (pLast->z - pF
69f0: 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 61 73 73 65  irst->z);.  asse
6a00: 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d  rt( pCol->zType=
6a10: 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c  =0 );.  z = pCol
6a20: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
6a30: 33 4d 50 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c  3MPrintf("%.*s",
6a40: 20 6e 2c 20 70 46 69 72 73 74 2d 3e 7a 29 3b 0a   n, pFirst->z);.
6a50: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6a60: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
6a70: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
6a80: 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a    int c = z[i];.
6a90: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
6aa0: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
6ab0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
6ac0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
6ad0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6ae0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
6af0: 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a  yType(z, n);.}..
6b00: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
6b10: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
6b20: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
6b30: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6b40: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
6b50: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
6b60: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6b70: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
6b80: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
6b90: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
6ba0: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
6bb0: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
6bc0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
6bd0: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
6be0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6bf0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
6c00: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
6c10: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
6c20: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
6c30: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6c40: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
6c50: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
6c60: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
6c70: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
6c80: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
6c90: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
6ca0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
6cb0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
6cc0: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
6cd0: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
6ce0: 6c 2d 31 5d 29 3b 0a 20 20 69 66 28 20 21 73 71  l-1]);.  if( !sq
6cf0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6d00: 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
6d10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6d20: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
6d30: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
6d40: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
6d50: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
6d60: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a    pCol->zName);.
6d70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6d80: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6d90: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
6da0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73   pCol->pDflt = s
6db0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
6dc0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
6dd0: 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
6de0: 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
6df0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
6e00: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
6e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
6e20: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
6e30: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
6e40: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
6e50: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
6e60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
6e70: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
6e80: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
6e90: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
6ea0: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
6eb0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
6ec0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
6ed0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
6ee0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
6ef0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
6f00: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
6f10: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
6f20: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
6f30: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
6f40: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
6f50: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
6f60: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
6f70: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
6f80: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
6f90: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
6fa0: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
6fb0: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
6fc0: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
6fd0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
6fe0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
6ff0: 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63  he row id.  (Exc
7000: 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62  eption:.** For b
7010: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
7020: 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
7030: 72 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20  r databases, do 
7040: 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69  not do this.** i
7050: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7060: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  t version number
7070: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   is less than 1.
7080: 29 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  )  Set the Table
7090: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
70a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
70b0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
70c0: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
70d0: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
70e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
70f0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
7100: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
7110: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
7120: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
7130: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
7140: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
7150: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
7160: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
7170: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
7180: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
7190: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
71a0: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
71b0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
71c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
71d0: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
71e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
71f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7200: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7210: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
7220: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
7230: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
7240: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
7250: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
7260: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
7270: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
7280: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
7290: 6e 63 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc       /* True
72a0: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
72b0: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
72c0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20   present */.){. 
72d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
72e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
72f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
7300: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
7310: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
7320: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72  Tab==0 ) goto pr
7330: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
7340: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
7350: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
7360: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7370: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
7380: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
7390: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
73a0: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
73b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
73c0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
73d0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
73e0: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
73f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
7400: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
7410: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
7420: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7430: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
7440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
7450: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
7460: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7470: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
7480: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
7490: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
74a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
74b0: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
74c0: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
74d0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
74e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
74f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7510: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
7520: 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l ) pTab->aCol[i
7530: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
7540: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
7550: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
7560: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
7570: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
7580: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
7590: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
75a0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
75b0: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
75c0: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
75d0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
75e0: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
75f0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
7600: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
7610: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
7620: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61  onError;.    pTa
7630: 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74  b->autoInc = aut
7640: 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oInc;.  }else if
7650: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
7660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7670: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7680: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7690: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
76a0: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
76b0: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
76c0: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
76d0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
76e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
76f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
7700: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
7710: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
7720: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a  onError, 0, 0);.
7730: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
7740: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
7750: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
7760: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
7770: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
7780: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
7790: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
77a0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
77b0: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
77c0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
77d0: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
77e0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
77f0: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
7800: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
7810: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
7820: 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29  Type, int nType)
7830: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7840: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 43  Index *pIdx;.  C
7850: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
7860: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28   int i;..  if( (
7870: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7880: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7890: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
78a0: 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  l-1;..  pColl = 
78b0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
78c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79  lSeq(pParse, zTy
78d0: 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d  pe, nType);.  p-
78e0: 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d  >aCol[i].pColl =
78f0: 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66   pColl;..  /* If
7900: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
7910: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
7920: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
7930: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
7940: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
7950: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
7960: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
7970: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
7980: 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  he.  ** collatio
7990: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
79a0: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
79b0: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
79c0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
79d0: 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70  x = p->pIndex; p
79e0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
79f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65  pNext){.    asse
7a00: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
7a10: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  n==1 );.    if( 
7a20: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
7a30: 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65 79  ]==i ) pIdx->key
7a40: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
7a50: 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pColl;.  }.}../*
7a60: 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20 72  .** Locate and r
7a70: 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20 66  eturn an entry f
7a80: 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c  rom the db.aColl
7a90: 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Seq hash table. 
7aa0: 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20  If the entry.** 
7ab0: 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e 61  specified by zNa
7ac0: 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20  me and nName is 
7ad0: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70 61  not found and pa
7ae0: 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65 27  rameter 'create'
7af0: 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
7b00: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
7b10: 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 20  ntry. Otherwise 
7b20: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
7b30: 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20  ** Each pointer 
7b40: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71  stored in the sq
7b50: 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68  lite3.aCollSeq h
7b60: 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ash table contai
7b70: 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f  ns an.** array o
7b80: 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65 71 20  f three CollSeq 
7b90: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
7ba0: 66 69 72 73 74 20 69 73 20 74 68 65 20 63 6f 6c  first is the col
7bb0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a  lation sequence.
7bc0: 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20 66 6f  ** prefferred fo
7bd0: 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73 65 63  r UTF-8, the sec
7be0: 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e  ond UTF-16le, an
7bf0: 64 20 74 68 65 20 74 68 69 72 64 20 55 54 46 2d  d the third UTF-
7c00: 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  16be..**.** Stor
7c10: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
7c20: 66 74 65 72 20 74 68 65 20 74 68 72 65 65 20 63  fter the three c
7c30: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7c40: 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66 0a  es is a copy of.
7c50: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** the collation
7c60: 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20   sequence name. 
7c70: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  A pointer to thi
7c80: 73 20 73 74 72 69 6e 67 20 69 73 20 73 74 6f 72  s string is stor
7c90: 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f  ed in.** each co
7ca0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7cb0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
7cc0: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20  tatic CollSeq * 
7cd0: 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79  findCollSeqEntry
7ce0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7cf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7d00: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
7d10: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
7d20: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
7d30: 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  oll;.  if( nName
7d40: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
7d50: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43  len(zName);.  pC
7d60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
7d70: 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
7d80: 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
7d90: 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43  e);..  if( 0==pC
7da0: 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b  oll && create ){
7db0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
7dc0: 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a  iteMalloc( 3*siz
7dd0: 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e  eof(*pColl) + nN
7de0: 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ame + 1 );.    i
7df0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
7e00: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65    pColl[0].zName
7e10: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
7e20: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
7e30: 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [0].enc = SQLITE
7e40: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f  _UTF8;.      pCo
7e50: 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63  ll[1].zName = (c
7e60: 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a  har*)&pColl[3];.
7e70: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65        pColl[1].e
7e80: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
7e90: 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  6LE;.      pColl
7ea0: 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [2].zName = (cha
7eb0: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
7ec0: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63      pColl[2].enc
7ed0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
7ee0: 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  E;.      memcpy(
7ef0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  pColl[0].zName, 
7f00: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
7f10: 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e       pColl[0].zN
7f20: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
7f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
7f40: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f  hInsert(&db->aCo
7f50: 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e  llSeq, pColl[0].
7f60: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43  zName, nName, pC
7f70: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
7f80: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
7f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
7fa0: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
7fb0: 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64  to a UTF-8 encod
7fc0: 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20  ed string nName 
7fd0: 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52  bytes long..** R
7fe0: 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65  eturn the CollSe
7ff0: 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74  q* pointer for t
8000: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
8010: 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d  uence named zNam
8020: 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 63  e.** for the enc
8030: 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d  oding 'enc' from
8040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27 64   the database 'd
8050: 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  b'..**.** If the
8060: 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65 64   entry specified
8070: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e   is not found an
8080: 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74 72  d 'create' is tr
8090: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
80a0: 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20  a.** new entry. 
80b0: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
80c0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53  n NULL..*/.CollS
80d0: 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 43  eq *sqlite3FindC
80e0: 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74 65  ollSeq(.  sqlite
80f0: 33 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c  3 *db,.  u8 enc,
8100: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8110: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
8120: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
8130: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
8140: 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65  oll = findCollSe
8150: 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65  qEntry(db, zName
8160: 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29  , nName, create)
8170: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
8180: 54 45 5f 55 54 46 38 3d 3d 31 20 26 26 20 53 51  TE_UTF8==1 && SQ
8190: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20  LITE_UTF16LE==2 
81a0: 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  && SQLITE_UTF16B
81b0: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
81c0: 28 20 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54  ( enc>=SQLITE_UT
81d0: 46 38 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54  F8 && enc<=SQLIT
81e0: 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69  E_UTF16BE );.  i
81f0: 66 28 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  f( pColl ) pColl
8200: 20 2b 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74   += enc-1;.  ret
8210: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
8220: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 27  .** Invoke the '
8230: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
8240: 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65  ' callback to re
8250: 71 75 65 73 74 20 61 20 63 6f 6c 6c 61 74 69 6f  quest a collatio
8260: 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69 6e  n sequence.** in
8270: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 65   the database te
8280: 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 6e  xt encoding of n
8290: 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74  ame zName, lengt
82a0: 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20 74  h nName..** If t
82b0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
82c0: 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20  uence.*/.static 
82d0: 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65  void callCollNee
82e0: 64 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ded(sqlite3 *db,
82f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8300: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
8310: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 78    assert( !db->x
8320: 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64  CollNeeded || !d
8330: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
8340: 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c   );.  if( nName<
8350: 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  0 ) nName = strl
8360: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(zName);.  if(
8370: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
8380: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
8390: 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  xternal = sqlite
83a0: 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20 6e  StrNDup(zName, n
83b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
83c0: 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75  zExternal ) retu
83d0: 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c  rn;.    db->xCol
83e0: 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c  lNeeded(db->pCol
83f0: 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20  lNeededArg, db, 
8400: 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45  (int)db->enc, zE
8410: 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  xternal);.    sq
8420: 6c 69 74 65 46 72 65 65 28 7a 45 78 74 65 72 6e  liteFree(zExtern
8430: 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  al);.  }.  if( d
8440: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
8450: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   ){.    char con
8460: 73 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a 20  st *zExternal;. 
8470: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
8480: 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
8490: 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75  GetTransientValu
84a0: 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(db);.    sqlit
84b0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 54  e3ValueSetStr(pT
84c0: 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53  mp, -1, zName, S
84d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
84e0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
84f0: 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69  zExternal = sqli
8500: 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 54 6d  te3ValueText(pTm
8510: 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  p, SQLITE_UTF16N
8520: 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  ATIVE);.    if( 
8530: 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74  !zExternal ) ret
8540: 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f  urn;.    db->xCo
8550: 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70  llNeeded16(db->p
8560: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64  CollNeededArg, d
8570: 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c  b, (int)db->enc,
8580: 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d   zExternal);.  }
8590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
85a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
85b0: 20 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   if the collatio
85c0: 6e 20 66 61 63 74 6f 72 79 20 66 61 69 6c 73 20  n factory fails 
85d0: 74 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a 20  to deliver a.** 
85e0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
85f0: 6f 6e 20 69 6e 20 74 68 65 20 62 65 73 74 20 65  on in the best e
8600: 6e 63 6f 64 69 6e 67 20 62 75 74 20 74 68 65 72  ncoding but ther
8610: 65 20 6d 61 79 20 62 65 20 6f 74 68 65 72 20 76  e may be other v
8620: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68  ersions.** of th
8630: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  is collation fun
8640: 63 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65 72  ction (for other
8650: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
8660: 20 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65 20   available. Use 
8670: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20  one.** of these 
8680: 69 6e 73 74 65 61 64 20 69 66 20 74 68 65 79 20  instead if they 
8690: 65 78 69 73 74 2e 20 41 76 6f 69 64 20 61 20 55  exist. Avoid a U
86a0: 54 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36 20  TF-8 <-> UTF-16 
86b0: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a 2a  conversion if.**
86c0: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74   possible..*/.st
86d0: 61 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43 6f  atic int synthCo
86e0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
86f0: 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  rse, CollSeq *pC
8700: 6f 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  oll){.  CollSeq 
8710: 2a 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72 20  *pColl2;.  char 
8720: 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  *z = pColl->zNam
8730: 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  e;.  int n = str
8740: 6c 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65  len(z);.  sqlite
8750: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8760: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  db;.  int i;.  s
8770: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
8780: 45 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45  Enc[] = { SQLITE
8790: 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45  _UTF16BE, SQLITE
87a0: 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45  _UTF16LE, SQLITE
87b0: 5f 55 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69  _UTF8 };.  for(i
87c0: 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20  =0; i<3; i++){. 
87d0: 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69     pColl2 = sqli
87e0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
87f0: 62 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e  b, aEnc[i], z, n
8800: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
8810: 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b  oll2->xCmp!=0 ){
8820: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43  .      memcpy(pC
8830: 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a  oll, pColl2, siz
8840: 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20  eof(CollSeq));. 
8850: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8860: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
8870: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8880: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Err==0 ){.    sq
8890: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
88a0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
88b0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
88c0: 65 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b  e: %.*s", n, z);
88d0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
88e0: 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Err++;.  return 
88f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
8900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8910: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
8920: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
8930: 75 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74 20  uence before it 
8940: 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68  is used to.** ch
8950: 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 64  eck that it is d
8960: 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66  efined. An undef
8970: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ined collation s
8980: 65 71 75 65 6e 63 65 20 65 78 69 73 74 73 20 77  equence exists w
8990: 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  hen.** a databas
89a0: 65 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61 74  e is loaded that
89b0: 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65   contains refere
89c0: 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f  nces to collatio
89d0: 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74  n sequences.** t
89e0: 68 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65 65  hat have not bee
89f0: 6e 20 64 65 66 69 6e 65 64 20 62 79 20 73 71 6c  n defined by sql
8a00: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
8a10: 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a  ation() etc..**.
8a20: 2a 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  ** If required, 
8a30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c  this routine cal
8a40: 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f  ls the 'collatio
8a50: 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61  n needed' callba
8a60: 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ck to.** request
8a70: 20 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66   a definition of
8a80: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
8a90: 65 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69 73  equence. If this
8aa0: 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a   doesn't work, .
8ab0: 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  ** an equivalent
8ac0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8ad0: 6e 63 65 20 74 68 61 74 20 75 73 65 73 20 61 20  nce that uses a 
8ae0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64 69  text encoding di
8af0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
8b00: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
8b10: 65 20 69 73 20 73 75 62 73 74 69 74 75 74 65 64  e is substituted
8b20: 2c 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61 69  , if one is avai
8b30: 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lable..*/.int sq
8b40: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
8b50: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
8b60: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
8b70: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26  {.  if( pColl &&
8b80: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b   !pColl->xCmp ){
8b90: 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61  .    /* No colla
8ba0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
8bb0: 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74   this type for t
8bc0: 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  his encoding is 
8bd0: 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20  registered..    
8be0: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c  ** Call the coll
8bf0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f  ation factory to
8c00: 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73   see if it can s
8c10: 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e  upply us with on
8c20: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
8c30: 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61  llCollNeeded(pPa
8c40: 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rse->db, pColl->
8c50: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43  zName, strlen(pC
8c60: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  oll->zName));.  
8c70: 20 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43    if( !pColl->xC
8c80: 6d 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53  mp && synthCollS
8c90: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
8ca0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8cb0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8cc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8cd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8ce0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
8cf0: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
8d00: 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74  ) for all collat
8d10: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e  ing sequences in
8d20: 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e   an index,.** in
8d30: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
8d40: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65   that all the ne
8d50: 63 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e  cessary collatin
8d60: 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a  g sequences are.
8d70: 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e  ** loaded..*/.in
8d80: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e  t sqlite3CheckIn
8d90: 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  dexCollSeq(Parse
8da0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
8db0: 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49  *pIdx){.  if( pI
8dc0: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  dx ){.    int i;
8dd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8de0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
8df0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8e00: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
8e10: 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  eq(pParse, pIdx-
8e20: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
8e30: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
8e40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8e50: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
8e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8e70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8e80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8e90: 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c  returns the coll
8ea0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
8eb0: 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  or database nati
8ec0: 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64  ve text.** encod
8ed0: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62  ing identified b
8ee0: 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61  y the string zNa
8ef0: 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65  me, length nName
8f00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
8f10: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
8f20: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
8f30: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  ot available, or
8f40: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
8f50: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
8f60: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
8f70: 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  g, the collation
8f80: 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f   factory is invo
8f90: 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ked to.** reques
8fa0: 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c  t it. If the col
8fb0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64  lation factory d
8fc0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73  oes not supply s
8fd0: 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a  uch a sequence,.
8fe0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65  ** and the seque
8ff0: 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  nce is available
9000: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74   in another text
9010: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
9020: 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72  that is.** retur
9030: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ned instead..**.
9040: 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e  ** If no version
9050: 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  s of the request
9060: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65  ed collations se
9070: 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c  quence are avail
9080: 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74  able, or.** anot
9090: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
90a0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
90b0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
90c0: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
90d0: 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  into.** pParse..
90e0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
90f0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9100: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9110: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9120: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
9130: 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65   u8 enc = pParse
9140: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20  ->db->enc;.  u8 
9150: 69 6e 69 74 62 75 73 79 20 3d 20 70 50 61 72 73  initbusy = pPars
9160: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
9170: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
9180: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
9190: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e  CollSeq(pParse->
91a0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
91b0: 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  nName, initbusy)
91c0: 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20  ;.  if( nName<0 
91d0: 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  ) nName = strlen
91e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  (zName);.  if( !
91f0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
9200: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
9210: 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  Cmp) ){.    /* N
9220: 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  o collation sequ
9230: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70  ence of this typ
9240: 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64  e for this encod
9250: 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65  ing is registere
9260: 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74  d..    ** Call t
9270: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9280: 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20 69  tory to see if i
9290: 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20  t can supply us 
92a0: 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  with one..    */
92b0: 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65  .    callCollNee
92c0: 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ded(pParse->db, 
92d0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
92e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
92f0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50  e3FindCollSeq(pP
9300: 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a  arse->db, enc, z
9310: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b  Name, nName, 0);
9320: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  .    if( pColl &
9330: 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  & !pColl->xCmp )
9340: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
9350: 20 6d 61 79 20 62 65 20 61 20 76 65 72 73 69 6f   may be a versio
9360: 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  n of the collati
9370: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
9380: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
9390: 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62  ** translation b
93a0: 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73  etween encodings
93b0: 2e 20 53 65 61 72 63 68 20 66 6f 72 20 69 74 20  . Search for it 
93c0: 77 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53 65  with synthCollSe
93d0: 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  q()..      */.  
93e0: 20 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f 6c      if( synthCol
93f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
9400: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ll) ){.        r
9410: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
9420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9430: 20 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73 20   If nothing has 
9440: 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69 74  been found, writ
9450: 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  e the error mess
9460: 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65 20  age into pParse 
9470: 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  */.  if( !initbu
9480: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
9490: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
94a0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
94b0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
94c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
94d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
94e0: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
94f0: 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e  quence: %.*s", n
9500: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
9510: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20    }.    pColl = 
9520: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9530: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  pColl;.}..../*.*
9540: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
9550: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
9560: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
9570: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
9580: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
9590: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a  finity type..*/.
95a0: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
95b0: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
95c0: 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20  har *zType, int 
95d0: 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c  nType){.  int n,
95e0: 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   i;.  static con
95f0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
9600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62  const char *zSub
9610: 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73  ;  /* Keywords s
9620: 75 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72  ubstring to sear
9630: 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63 68  ch for */.    ch
9640: 61 72 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  ar nSub;        
9650: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53   /* length of zS
9660: 75 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61  ub */.    char a
9670: 66 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20  ffinity;     /* 
9680: 41 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75  Affinity to retu
9690: 72 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65 73  rn if it matches
96a0: 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e   */.  } substrin
96b0: 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49  gs[] = {.    {"I
96c0: 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f  NT",  3, SQLITE_
96d0: 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20  AFF_INTEGER},.  
96e0: 20 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51    {"CHAR", 4, SQ
96f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a  LITE_AFF_TEXT},.
9700: 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20      {"CLOB", 4, 
9710: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d  SQLITE_AFF_TEXT}
9720: 2c 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34  ,.    {"TEXT", 4
9730: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  , SQLITE_AFF_TEX
9740: 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c  T},.    {"BLOB",
9750: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   4, SQLITE_AFF_N
9760: 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66  ONE},.  };..  if
9770: 28 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( nType==0 ){.  
9780: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9790: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20  AFF_NONE;.  }.  
97a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
97b0: 66 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69  f(substrings)/si
97c0: 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b  zeof(substrings[
97d0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
97e0: 6e 74 20 63 31 20 3d 20 73 75 62 73 74 72 69 6e  nt c1 = substrin
97f0: 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20  gs[i].zSub[0];. 
9800: 20 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f     int c2 = tolo
9810: 77 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e 74  wer(c1);.    int
9820: 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d   limit = nType -
9830: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e   substrings[i].n
9840: 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Sub;.    const c
9850: 68 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72 69  har *z = substri
9860: 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20  ngs[i].zSub;.   
9870: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d   for(n=0; n<=lim
9880: 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  it; n++){.      
9890: 69 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d  int c = zType[n]
98a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d  ;.      if( (c==
98b0: 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20  c1 || c==c2).   
98c0: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
98d0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
98e0: 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75  &zType[n], z, su
98f0: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62  bstrings[i].nSub
9900: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
9910: 75 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b 69  urn substrings[i
9920: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
9930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9940: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
9950: 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a  F_NUMERIC;.}../*
9960: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
9970: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72  e that will incr
9980: 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61  ement the schema
9990: 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54   cookie..**.** T
99a0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
99b0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
99c0: 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73  rmine when the s
99d0: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a  chema for the.**
99e0: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
99f0: 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73  s.  After each s
9a00: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68  chema change, th
9a10: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a  e cookie value.*
9a20: 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e  * changes.  When
9a30: 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74   a process first
9a40: 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d   reads the schem
9a50: 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65  a it records the
9a60: 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65  .** cookie.  The
9a70: 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65  reafter, wheneve
9a80: 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63  r it goes to acc
9a90: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
9aa0: 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74  ,.** it checks t
9ab0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b  he cookie to mak
9ac0: 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d  e sure the schem
9ad0: 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65  a has not change
9ae0: 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61  d.** since it wa
9af0: 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a  s last read..**.
9b00: 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20  ** This plan is 
9b10: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62  not completely b
9b20: 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74  ullet-proof.  It
9b30: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
9b40: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74  .** the schema t
9b50: 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c  o change multipl
9b60: 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20  e times and for 
9b70: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65  the cookie to be
9b80: 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20  .** set back to 
9b90: 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75  prior value.  Bu
9ba0: 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  t schema changes
9bb0: 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a   are infrequent.
9bc0: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61  ** and the proba
9bd0: 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e  bility of hittin
9be0: 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69  g the same cooki
9bf0: 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  e value is only.
9c00: 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32  ** 1 chance in 2
9c10: 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73  ^32.  So we're s
9c20: 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76  afe enough..*/.v
9c30: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
9c40: 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20  eCookie(sqlite3 
9c50: 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e  *db, Vdbe *v, in
9c60: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
9c70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9c80: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44  _Integer, db->aD
9c90: 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
9ca0: 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71  okie+1, 0);.  sq
9cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9cc0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
9cd0: 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iDb, 0);.}../*.*
9ce0: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
9cf0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
9d00: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
9d10: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
9d20: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
9d30: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
9d40: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
9d50: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
9d60: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
9d70: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
9d80: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
9d90: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
9da0: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
9db0: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
9dc0: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
9dd0: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
9de0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
9df0: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
9e00: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
9e10: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
9e20: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
9e30: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
9e40: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
9e50: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
9e60: 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e  ** Write an iden
9e70: 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20  tifier onto the 
9e80: 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  end of the given
9e90: 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a   string.  Add.**
9ea0: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
9eb0: 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s as needed..*/.
9ec0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
9ed0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
9ee0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
9ef0: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
9f00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
9f10: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
9f20: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
9f30: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
9f40: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
9f50: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
9f60: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
9f70: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
9f80: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
9f90: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
9fa0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
9fb0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
9fc0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
9fd0: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
9fe0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
9ff0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
a000: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
a010: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
a020: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
a030: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a040: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
a050: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
a060: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
a070: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
a080: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
a090: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
a0a0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
a0b0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
a0c0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
a0d0: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
a0e0: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
a0f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a100: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
a110: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
a120: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
a130: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
a140: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
a150: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
a160: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
a170: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
a180: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
a190: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
a1a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
a1b0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62  ateTableStmt(Tab
a1c0: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
a1d0: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
a1e0: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
a1f0: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
a200: 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  d, *z;.  Column 
a210: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
a220: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
a230: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
a240: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a250: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
a260: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
a270: 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70  Name);.    z = p
a280: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
a290: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e  if( z ){.      n
a2a0: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b   += (strlen(z) +
a2b0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
a2c0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
a2d0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
a2e0: 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a  f( n<50 ){.    z
a2f0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
a300: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
a310: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
a320: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
a330: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
a340: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
a350: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
a360: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
a370: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
a380: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
a390: 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  aw( n );.  if( z
a3a0: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
a3b0: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74   0;.  strcpy(zSt
a3c0: 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20  mt, p->iDb==1 ? 
a3d0: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
a3e0: 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54  LE " : "CREATE T
a3f0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
a400: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
a410: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a420: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
a430: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
a440: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
a450: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
a460: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
a470: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  ++){.    strcpy(
a480: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
a490: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
a4a0: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
a4b0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
a4c0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
a4d0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
a4e0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  ame);.    if( (z
a4f0: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21   = pCol->zType)!
a500: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  =0 ){.      zStm
a510: 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  t[k++] = ' ';.  
a520: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
a530: 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20  t[k], z);.      
a540: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a  k += strlen(z);.
a550: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63      }.  }.  strc
a560: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
a570: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
a580: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
a590: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a5a0: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
a5b0: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
a5c0: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
a5d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a5e0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a5f0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
a600: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
a610: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
a620: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
a630: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
a640: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
a650: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
a660: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
a670: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
a680: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
a690: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
a6a0: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
a6b0: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
a6c0: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
a6d0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
a6e0: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
a6f0: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
a700: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a710: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
a720: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
a730: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a740: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
a750: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
a760: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
a770: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
a780: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a790: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
a7a0: 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f  ntly changes, so
a7b0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
a7c0: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
a7d0: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
a7e0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
a7f0: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
a800: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
a810: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
a820: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
a830: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
a840: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
a850: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
a860: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
a870: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
a880: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
a890: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
a8a0: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
a8b0: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
a8c0: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
a8d0: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
a8e0: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
a8f0: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
a900: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
a910: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a920: 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20  3EndTable(Parse 
a930: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
a940: 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53  pEnd, Select *pS
a950: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
a960: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
a970: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a980: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
a990: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
a9a0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
a9b0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
a9c0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
a9d0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
a9e0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
a9f0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
aa00: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
aa10: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
aa20: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  elect );..  /* I
aa30: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
aa40: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
aa50: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
aa60: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
aa70: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
aa80: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
aa90: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
aaa0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
aab0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
aac0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
aad0: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
aae0: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
aaf0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
ab00: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
ab10: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
ab20: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
ab30: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
ab40: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
ab50: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
ab60: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
ab70: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
ab80: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
ab90: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
aba0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
abb0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
abc0: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
abd0: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
abe0: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
abf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
ac00: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
ac10: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
ac20: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
ac30: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
ac40: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
ac50: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
ac60: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
ac70: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
ac80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
ac90: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
aca0: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
acb0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
acc0: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
acd0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
ace0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
acf0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
ad00: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
ad10: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
ad20: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
ad30: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
ad40: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
ad50: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
ad60: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
ad70: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
ad80: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
ad90: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
ada0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
adb0: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
adc0: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
add0: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
ade0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
adf0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
ae00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  0 ) return;..   
ae10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae20: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
ae30: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  , 0);..    /* Cr
ae40: 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
ae50: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  e for the new ta
ae60: 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20  ble and push it 
ae70: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
ae80: 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61      ** A view ha
ae90: 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73  s no rootpage, s
aea0: 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65  o just push a ze
aeb0: 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ro onto the stac
aec0: 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65  k for.    ** vie
aed0: 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  ws.  Initialize 
aee0: 7a 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d  zType at the sam
aef0: 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  e time..    */. 
af00: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
af10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
af20: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
af30: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
af40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
af50: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 70 2d  _CreateTable, p-
af60: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
af70: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
af80: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
af90: 22 54 41 42 4c 45 22 3b 0a 20 20 20 20 7d 65 6c  "TABLE";.    }el
afa0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
afb0: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  iew */.      sql
afc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
afd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
afe0: 30 29 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  0);.      zType 
aff0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
b000: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
b010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b020: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
b030: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
b040: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
b050: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
b060: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
b070: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
b080: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
b090: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
b0a0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
b0b0: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
b0c0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
b0d0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
b0e0: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
b0f0: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
b100: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
b110: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
b120: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
b130: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
b140: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
b150: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
b160: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
b170: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
b180: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
b190: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
b1a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
b1b0: 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  elTab;.      sql
b1c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b1d0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
b1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b200: 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29  eger, p->iDb, 0)
b210: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b220: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b230: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b  penWrite, 1, 0);
b240: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
b250: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
b260: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
b270: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
b280: 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30  T_Table, 1, 0, 0
b290: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b2a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b2b0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
b2c0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
b2d0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
b2e0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
b2f0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
b300: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
b310: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b  se, 0, pSelect);
b320: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
b330: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
b340: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b350: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
b360: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
b370: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
b380: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
b390: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
b3a0: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
b3b0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
b3c0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
b3d0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
b3e0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
b3f0: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
b400: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
b410: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
b420: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
b430: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
b440: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
b450: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
b460: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
b470: 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a  teTableStmt(p);.
b480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b490: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
b4a0: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
b4b0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20  ->sNameToken.z) 
b4c0: 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74  + 1;.      zStmt
b4d0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
b4e0: 66 28 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a  f("CREATE %s %.*
b4f0: 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
b500: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
b510: 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n.z);.    }..   
b520: 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74   /* A slot for t
b530: 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c  he record has al
b540: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
b550: 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20  ated in the .   
b560: 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   ** SQLITE_MASTE
b570: 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73  R table.  We jus
b580: 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65  t need to update
b590: 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20   that slot with 
b5a0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  all.    ** the i
b5b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65  nformation we've
b5c0: 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65   collected.  The
b5d0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70   rowid for the p
b5e0: 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  reallocated.    
b5f0: 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32  ** slot is the 2
b600: 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  nd item on the s
b610: 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f  tack.  The top o
b620: 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74  f the stack is t
b630: 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
b640: 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  age for the new 
b650: 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66  table (or a 0 if
b660: 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29   this is a view)
b670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
b680: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
b690: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
b6a0: 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
b6b0: 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
b6c0: 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
b6d0: 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
b6e0: 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51  tpage=#0, sql=%Q
b6f0: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
b700: 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20   rowid=#1",.    
b710: 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62    db->aDb[p->iDb
b720: 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
b730: 54 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a 20  TABLE(p->iDb),. 
b740: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
b750: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
b760: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
b770: 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
b780: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53     sqliteFree(zS
b790: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    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 0a 23  , v, p->iDb);..#
b7c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b7d0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
b7e0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
b7f0: 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
b800: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
b810: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
b820: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
b830: 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
b840: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
b850: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
b860: 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  ( p->autoInc ){.
b870: 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
b880: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
b890: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
b8a0: 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
b8b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
b8c0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
b8d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
b8e0: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
b8f0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 41 53 20  ite_sequence AS 
b900: 53 45 4c 45 43 54 20 25 51 20 41 53 20 6e 61 6d  SELECT %Q AS nam
b910: 65 2c 20 30 20 41 53 20 73 65 71 3b 22 2c 0a 20  e, 0 AS seq;",. 
b920: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
b930: 61 6d 65 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20  ame, p->zName.  
b940: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
b950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b960: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
b970: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b980: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
b990: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
b9a0: 63 65 20 56 41 4c 55 45 53 28 25 51 2c 30 29 22  ce VALUES(%Q,0)"
b9b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
b9c0: 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 7a 4e 61 6d 65  >zName, p->zName
b9d0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
b9e0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
b9f0: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
ba00: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
ba10: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
ba20: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
ba30: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
ba40: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
ba50: 61 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69  arseSchema, p->i
ba60: 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73  Db, 0,.        s
ba70: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74  qlite3MPrintf("t
ba80: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d  bl_name='%q'",p-
ba90: 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
baa0: 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  MIC);.  }...  /*
bab0: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
bac0: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
bad0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
bae0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
baf0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
bb00: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
bb10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
bb20: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
bb30: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
bb40: 20 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20   .    Db *pDb = 
bb50: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
bb60: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
bb70: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
bb80: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  pDb->tblHash, p-
bb90: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
bba0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
bbb0: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
bbc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
bbd0: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
bbe0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
bbf0: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
bc00: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
bc10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
bc20: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
bc30: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
bc40: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
bc50: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
bc60: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
bc70: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
bc80: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
bc90: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61  xtTo = sqlite3Ha
bca0: 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b  shFind(&pDb->aFK
bcb0: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
bcc0: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nTo);.      sqli
bcd0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
bce0: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
bcf0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65  ->zTo, nTo, pFKe
bd00: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  y);.    }.    pP
bd10: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
bd20: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
bd30: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
bd40: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
bd50: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
bd60: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
bd70: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
bd80: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
bd90: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
bda0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
bdb0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
bdc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
bdd0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
bde0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bdf0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
be00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
be10: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
be20: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
be30: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
be40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
be50: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
be60: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
be70: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
be80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
be90: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
bea0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
beb0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
bec0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
bed0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
bee0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
bef0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
bf00: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
bf10: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
bf20: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
bf30: 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp         /* TR
bf40: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
bf50: 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20  RY view */.){.  
bf60: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
bf70: 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  n;.  const unsig
bf80: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  ned char *z;.  T
bf90: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
bfa0: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
bfb0: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71  en *pName;..  sq
bfc0: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
bfd0: 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20  pParse, pBegin, 
bfe0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
bff0: 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20  isTemp, 1);.  p 
c000: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
c010: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
c020: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
c030: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
c040: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
c050: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
c060: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
c070: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
c080: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
c090: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
c0a0: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
c0b0: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70  &sFix, pParse, p
c0c0: 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  ->iDb, "view", p
c0d0: 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c  Name).    && sql
c0e0: 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
c0f0: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20  Fix, pSelect).  
c100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
c110: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
c120: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
c130: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
c140: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
c150: 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
c160: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
c170: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
c180: 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
c190: 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
c1a0: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
c1b0: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
c1c0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
c1d0: 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
c1e0: 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
c1f0: 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
c200: 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
c210: 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
c220: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
c230: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
c240: 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
c250: 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
c260: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
c270: 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  up(pSelect);.  s
c280: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
c290: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  te(pSelect);.  i
c2a0: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
c2b0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c2c0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
c2d0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
c2e0: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
c2f0: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
c300: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
c310: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
c320: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
c330: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
c340: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
c350: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
c360: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
c370: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
c380: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
c390: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
c3a0: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
c3b0: 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d  ;.  n = sEnd.z -
c3c0: 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20   pBegin->z;.  z 
c3d0: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
c3e0: 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e  d char*)pBegin->
c3f0: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
c400: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
c410: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
c420: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
c430: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
c440: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
c450: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
c460: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
c470: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
c480: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
c490: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
c4a0: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
c4b0: 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20  se, &sEnd, 0);. 
c4c0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
c4d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c4e0: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
c4f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c500: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  EW./*.** The Tab
c510: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
c520: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
c530: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
c540: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
c550: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
c560: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
c570: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
c580: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
c590: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
c5a0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
c5b0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
c5c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
c5d0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
c5e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c5f0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
c600: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
c610: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
c620: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c630: 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ist;.  Select *p
c640: 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53  Sel;.  Table *pS
c650: 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72  elTab;.  int nEr
c660: 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
c670: 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f  ( pTable );..  /
c680: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
c690: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
c6a0: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
c6b0: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
c6c0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
c6d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
c6e0: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
c6f0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
c700: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
c710: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
c720: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
c730: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
c740: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
c750: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
c760: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
c770: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
c780: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
c790: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
c7a0: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
c7b0: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
c7c0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
c7d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
c7e0: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
c7f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
c800: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
c810: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
c820: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
c830: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
c840: 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  ally, this error
c850: 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69   is caught previ
c860: 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65  ously and so the
c870: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a   following test.
c880: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61    ** should alwa
c890: 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  ys fail.  But we
c8a0: 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69   will leave it i
c8b0: 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20  n place just to 
c8c0: 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20  be safe..  */.  
c8d0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
c8e0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
c8f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c900: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
c910: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
c920: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
c930: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
c940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
c950: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
c960: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
c970: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
c980: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  able names..  */
c990: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
c9a0: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a  e->pSelect ); /*
c9b0: 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65   If nCol==0, the
c9c0: 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65  n pTable must be
c9d0: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65   a VIEW */.  pSe
c9e0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  l = pTable->pSel
c9f0: 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20  ect;..  /* Note 
ca00: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
ca10: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
ca20: 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
ca30: 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
ca40: 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
ca50: 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74   this list.  But
ca60: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
ca70: 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73   restore the lis
ca80: 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69  t.  ** back to i
ca90: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
caa0: 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77  iguration afterw
cab0: 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65  ards, so we save
cac0: 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20   a copy of.  ** 
cad0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20  the original in 
cae0: 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70  pEList..  */.  p
caf0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45  EList = pSel->pE
cb00: 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45  List;.  pSel->pE
cb10: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
cb20: 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74  prListDup(pEList
cb30: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70  );.  if( pSel->p
cb40: 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  EList==0 ){.    
cb50: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
cb60: 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72  EList;.    retur
cb70: 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  n 1;  /* Malloc 
cb80: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
cb90: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
cba0: 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73  1;.  pSelTab = s
cbb0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
cbc0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
cbd0: 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20  0, pSel);.  if( 
cbe0: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61  pSelTab ){.    a
cbf0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
cc00: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  Col==0 );.    pT
cc10: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
cc20: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
cc30: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
cc40: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
cc50: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
cc60: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
cc70: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
cc80: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
cc90: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
cca0: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
ccb0: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
ccc0: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
ccd0: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
cce0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
ccf0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
cd00: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
cd10: 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e  lite3SelectUnbin
cd20: 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74  d(pSel);.  sqlit
cd30: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
cd40: 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a  (pSel->pEList);.
cd50: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
cd60: 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72   pEList;.  retur
cd70: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
cd80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
cd90: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64  T_VIEW */..#ifnd
cda0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
cdb0: 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
cdc0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
cdd0: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
cde0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
cdf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ce00: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
ce10: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
ce20: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
ce30: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
ce40: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
ce50: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
ce60: 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
ce70: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
ce80: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
ce90: 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68  aDb[idx].tblHash
cea0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
ceb0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
cec0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
ced0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
cee0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
cef0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
cf00: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
cf10: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
cf20: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
cf30: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
cf40: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
cf50: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
cf60: 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
cf70: 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
cf80: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
cf90: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
cfa0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cfb0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
cfc0: 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
cfd0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
cfe0: 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
cff0: 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
d000: 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
d010: 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
d020: 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
d030: 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
d040: 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
d050: 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
d060: 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
d070: 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23  .** to iTo..*/.#
d080: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d090: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
d0a0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
d0b0: 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c  geMoved(Db *pDb,
d0c0: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
d0d0: 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
d0e0: 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f   *pElem;.  .  fo
d0f0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
d100: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62  shFirst(&pDb->tb
d110: 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  lHash); pElem; p
d120: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
d130: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
d140: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
d150: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
d160: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
d170: 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
d180: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
d190: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20  num = iTo;.     
d1a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
d1b0: 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73   }.  for(pElem=s
d1c0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
d1d0: 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  pDb->idxHash); p
d1e0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
d1f0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
d200: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
d210: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
d220: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
d230: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
d240: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
d250: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
d260: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
d270: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
d280: 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rt(0);.}.#endif.
d290: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
d2a0: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
d2b0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
d2c0: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
d2d0: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
d2e0: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
d2f0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
d300: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d310: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
d320: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
d330: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
d340: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
d350: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
d360: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
d370: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
d380: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
d390: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
d3a0: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
d3b0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
d3c0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
d3d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
d3e0: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
d3f0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
d400: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d410: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
d420: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d430: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
d440: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
d450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d460: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
d470: 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e  estroy pushes an
d480: 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68   integer onto th
d490: 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73  e stack. If this
d4a0: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
d4b0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
d4c0: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
d4d0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
d4e0: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
d4f0: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
d500: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
d510: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 73 20  ng code modifis 
d520: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d530: 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
d540: 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
d550: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22  **.  ** The "#0"
d560: 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
d570: 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
d580: 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
d590: 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
d5a0: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
d5b0: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  f the stack.  Se
d5c0: 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  e sqlite3Registe
d5d0: 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  rExpr()..  */.  
d5e0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
d5f0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
d600: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
d610: 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
d620: 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74  HERE #0 AND root
d630: 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70  page=#0",.     p
d640: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
d650: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
d660: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
d670: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  able);.#endif.}.
d680: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
d690: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
d6a0: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
d6b0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
d6c0: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
d6d0: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
d6e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d6f0: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
d700: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
d710: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
d720: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
d730: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
d740: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
d750: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
d760: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
d770: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
d780: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
d790: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
d7a0: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
d7b0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
d7c0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
d7d0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
d7e0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d7f0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d800: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d810: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d820: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
d830: 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  num, pTab->iDb);
d840: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
d850: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d860: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d870: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
d880: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
d890: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d  Idx->tnum, pIdx-
d8a0: 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >iDb);.  }.#else
d8b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
d8c0: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
d8d0: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
d8e0: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
d8f0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
d900: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
d910: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
d920: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
d930: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
d940: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
d950: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
d960: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
d970: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
d980: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
d990: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
d9a0: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
d9b0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
d9c0: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
d9d0: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
d9e0: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
d9f0: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
da00: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
da10: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
da20: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
da30: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
da40: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
da50: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
da60: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
da70: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
da80: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
da90: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
daa0: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
dab0: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
dac0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
dad0: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
dae0: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
daf0: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
db00: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
db10: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
db20: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
db30: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
db40: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
db50: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
db60: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
db70: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
db80: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
db90: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
dba0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
dbb0: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
dbc0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
dbd0: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
dbe0: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
dbf0: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
dc00: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
dc10: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
dc20: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
dc30: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
dc40: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
dc50: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
dc60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
dc70: 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  dx->iDb==pTab->i
dc80: 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Db );.      if( 
dc90: 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
dca0: 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
dcb0: 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
dcc0: 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
dcd0: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
dce0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dcf0: 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
dd00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
dd10: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
dd20: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
dd30: 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  st, pTab->iDb);.
dd40: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
dd50: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23   iLargest;.  }.#
dd60: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
dd70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
dd80: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
dd90: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
dda0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
ddb0: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
ddc0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
ddd0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
dde0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ddf0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
de00: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
de10: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
de20: 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  iew){.  Table *p
de30: 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
de40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
de50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
de60: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
de70: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
de80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
de90: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
dea0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73  drop_table;.  as
deb0: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
dec0: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
ded0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
dee0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
def0: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
df00: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
df10: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
df20: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
df30: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
df40: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
df50: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
df60: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
df70: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
df80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
df90: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
dfa0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
dfb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
dfc0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62  CHEMA_TABLE(pTab
dfd0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  ->iDb);.    cons
dfe0: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
dff0: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
e000: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
e010: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e020: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e030: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
e040: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
e050: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e060: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
e070: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
e080: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
e090: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e0a0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
e0b0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
e0c0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
e0d0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
e0e0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
e0f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
e100: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
e110: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e120: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
e130: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e140: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
e150: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
e160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e170: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
e180: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
e190: 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
e1a0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
e1b0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e1c0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
e1d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e1e0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e1f0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e200: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
e210: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
e220: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e230: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
e240: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d  ndif.  if( pTab-
e250: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
e260: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e270: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
e280: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
e290: 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
e2a0: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ame);.    pParse
e2b0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
e2c0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e2d0: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  le;.  }.  if( is
e2e0: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
e2f0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
e300: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e310: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
e320: 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
e330: 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
e340: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e350: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e360: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
e370: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
e380: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
e390: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e3a0: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
e3b0: 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
e3c0: 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
e3d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
e3e0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e3f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
e400: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
e410: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
e420: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
e430: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
e440: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
e450: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e460: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
e470: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
e480: 69 67 67 65 72 3b 0a 20 20 20 20 69 6e 74 20 69  igger;.    int i
e490: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
e4a0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
e4b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
e4c0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
e4d0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
e4e0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
e4f0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
e500: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
e510: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
e520: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
e530: 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67  Code.    ** is g
e540: 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
e550: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
e560: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
e570: 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  d/or.    ** sqli
e580: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
e590: 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  f required..    
e5a0: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
e5b0: 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  = pTab->pTrigger
e5c0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
e5d0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61  igger ){.      a
e5e0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
e5f0: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72  >iDb==iDb || pTr
e600: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b  igger->iDb==1 );
e610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
e620: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
e630: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
e640: 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  );.      pTrigge
e650: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
e660: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
e670: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
e680: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
e690: 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
e6a0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
e6b0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
e6c0: 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
e6d0: 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
e6e0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e6f0: 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
e700: 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
e710: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
e720: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
e730: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
e740: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
e750: 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
e760: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
e770: 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
e780: 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
e790: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
e7a0: 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
e7b0: 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
e7c0: 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
e7d0: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
e7e0: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
e7f0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
e800: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
e810: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
e820: 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
e830: 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
e840: 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
e850: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
e860: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
e870: 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
e880: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
e890: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
e8a0: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
e8b0: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
e8c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e8d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
e8e0: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  MENT.    /* Remo
e8f0: 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
e900: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
e910: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
e920: 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
e930: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
e940: 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20  ng dropped */.  
e950: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f    if( pTab->auto
e960: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Inc ){.      sql
e970: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
e980: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
e990: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
e9a0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
e9b0: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
e9c0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
e9d0: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
e9e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
e9f0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
ea00: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
ea10: 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
ea20: 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
ea30: 6d 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ma.    */.    sq
ea40: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
ea50: 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
ea60: 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  b, 0, pTab->zNam
ea70: 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e, 0);.  }.  sql
ea80: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
ea90: 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
eaa0: 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
eab0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
eac0: 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
ead0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eae0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
eaf0: 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
eb00: 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
eb10: 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
eb20: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
eb30: 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
eb40: 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
eb50: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
eb60: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
eb70: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
eb80: 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
eb90: 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
eba0: 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
ebb0: 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
ebc0: 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
ebd0: 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
ebe0: 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
ebf0: 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54  referred to.  pT
ec00: 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f  oCol is a list o
ec10: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
ec20: 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62  other.** pTo tab
ec30: 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  le that the fore
ec40: 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74  ign key points t
ec50: 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  o.  flags contai
ec60: 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
ec70: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
ec80: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
ec90: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
eca0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
ecb0: 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
ecc0: 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
ecd0: 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
ece0: 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
ecf0: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
ed00: 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
ed10: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
ed20: 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
ed30: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
ed40: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ed50: 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65  e field.  The ne
ed60: 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74  w FKey.** is not
ed70: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d   linked into db-
ed80: 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70  >aFKey at this p
ed90: 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73  oint - that does
eda0: 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75   not happen.** u
edb0: 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54  ntil sqlite3EndT
edc0: 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  able()..**.** Th
edd0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
ede0: 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
edf0: 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
ee00: 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
ee10: 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
ee20: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
ee30: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
ee40: 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
ee50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
ee60: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
ee70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ee80: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
ee90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
eea0: 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
eeb0: 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
eec0: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
eed0: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
eee0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
eef0: 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
ef00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
ef10: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
ef20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
ef30: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
ef40: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
ef50: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
ef60: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ef70: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
ef80: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
ef90: 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  . */.){.#ifndef 
efa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
efb0: 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
efc0: 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62  pFKey = 0;.  Tab
efd0: 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
efe0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
eff0: 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
f000: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
f010: 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
f020: 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
f030: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
f040: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66  e->nErr ) goto f
f050: 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
f060: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
f070: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
f080: 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
f090: 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
f0a0: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
f0b0: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
f0c0: 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
f0d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f0e0: 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
f0f0: 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
f100: 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
f110: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
f120: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
f130: 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
f140: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
f150: 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
f160: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
f170: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
f180: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
f190: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
f1a0: 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
f1b0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
f1c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f1d0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
f1e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f1f0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
f200: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
f210: 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
f220: 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
f230: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
f240: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
f250: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
f260: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
f270: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
f280: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
f290: 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e  zeof(*pFKey) + n
f2a0: 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  Col*sizeof(pFKey
f2b0: 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
f2c0: 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
f2d0: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
f2e0: 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
f2f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f300: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
f310: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
f320: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
f330: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
f340: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
f350: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
f360: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
f370: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
f380: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
f390: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
f3a0: 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
f3b0: 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
f3c0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
f3d0: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
f3e0: 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
f3f0: 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
f400: 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
f410: 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
f420: 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
f430: 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
f440: 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
f450: 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
f460: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
f470: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
f480: 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
f490: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
f4a0: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
f4b0: 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
f4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
f4d0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
f4e0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
f4f0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
f500: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
f510: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
f520: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
f530: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
f540: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
f550: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
f560: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
f570: 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
f580: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f590: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f5a0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
f5b0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
f5c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f5d0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
f5e0: 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
f5f0: 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
f600: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
f610: 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
f620: 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
f630: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
f640: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f660: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
f670: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f680: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
f690: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
f6a0: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
f6b0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
f6c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
f6d0: 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
f6e0: 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
f6f0: 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
f700: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
f710: 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
f720: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
f730: 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
f740: 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
f750: 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
f760: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
f770: 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
f780: 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
f790: 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
f7a0: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
f7b0: 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
f7c0: 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
f7d0: 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
f7e0: 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
f7f0: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
f800: 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
f810: 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
f820: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
f830: 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  e(pFKey);.#endif
f840: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f850: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
f860: 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
f870: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
f880: 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71  (pFromCol);.  sq
f890: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
f8a0: 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  ete(pToCol);.}..
f8b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
f8c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
f8d0: 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
f8e0: 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
f8f0: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
f900: 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
f910: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
f920: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
f930: 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
f940: 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
f950: 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
f960: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
f970: 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
f980: 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
f990: 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
f9a0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f9b0: 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
f9c0: 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
f9d0: 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
f9e0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
f9f0: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
fa00: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
fa10: 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
fa20: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
fa30: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
fa40: 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
fa50: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
fa60: 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
fa70: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
fa80: 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
fa90: 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
faa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
fab0: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
fac0: 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
fad0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
fae0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
faf0: 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
fb00: 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
fb10: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
fb20: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
fb30: 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
fb40: 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
fb50: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
fb60: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
fb70: 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
fb80: 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
fb90: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
fba0: 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
fbb0: 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
fbc0: 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
fbd0: 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
fbe0: 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f  eated.  The memo
fbf0: 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65  ry cell specifie
fc00: 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
fc10: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
fc20: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
fc30: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
fc40: 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
fc50: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
fc60: 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
fc70: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
fc80: 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
fc90: 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
fca0: 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
fcb0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
fcc0: 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
fcd0: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
fce0: 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
fcf0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
fd00: 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
fd10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
fd20: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
fd30: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
fd40: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
fd50: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
fd60: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
fd70: 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
fd80: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
fd90: 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20  rse->nTab;      
fda0: 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
fdb0: 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
fdc0: 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
fdd0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20  Parse->nTab+1;  
fde0: 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
fdf0: 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
fe00: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ex */.  int addr
fe10: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
fe20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
fe30: 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
fe40: 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
fe70: 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
fe80: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fea0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
feb0: 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
fec0: 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69  l machine */.  i
fed0: 6e 74 20 69 73 55 6e 69 71 75 65 3b 20 20 20 20  nt isUnique;    
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fef0: 20 54 72 75 65 20 66 6f 72 20 61 20 75 6e 69 71   True for a uniq
ff00: 75 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 76  ue index */..  v
ff10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ff20: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ff30: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
ff40: 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
ff50: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
ff60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ff70: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52  OP_MemLoad, memR
ff80: 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  ootPage, 0);.   
ff90: 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c   tnum = 0;.  }el
ffa0: 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
ffb0: 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Index->tnum;.   
ffc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ffd0: 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  p(v, OP_Clear, t
ffe0: 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
fff0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
10000 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10010 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d  Integer, pIndex-
10020 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  >iDb, 0);.  sqli
10030 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10040 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
10050 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , tnum,.        
10060 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
10070 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  r*)&pIndex->keyI
10080 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
10090 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
100a0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
100b0 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  er, pTab->iDb, 0
100c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
100d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
100e0 52 65 61 64 2c 20 69 54 61 62 2c 20 70 54 61 62  Read, iTab, pTab
100f0 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  ->tnum);.  sqlit
10100 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10110 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
10120 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f   iTab, pTab->nCo
10130 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
10140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10150 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
10160 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
10170 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
10180 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  (v, pIndex, iTab
10190 29 3b 0a 20 20 69 73 55 6e 69 71 75 65 20 3d 20  );.  isUnique = 
101a0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
101b0 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c 69  =OE_None;.  sqli
101c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
101d0 4f 50 5f 49 64 78 50 75 74 2c 20 69 49 64 78 2c  OP_IdxPut, iIdx,
101e0 20 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 69 66   isUnique);.  if
101f0 28 20 69 73 55 6e 69 71 75 65 20 29 7b 0a 20 20  ( isUnique ){.  
10200 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10210 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e  ngeP3(v, -1, "in
10220 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
10230 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
10240 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20  3_STATIC);.  }. 
10250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10260 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
10270 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  ab, addr1+1);.  
10280 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10290 65 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71  eP2(v, addr1, sq
102a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
102b0 41 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69  Addr(v));.  sqli
102c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
102d0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20  OP_Close, iTab, 
102e0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
102f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10300 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a  se, iIdx, 0);.}.
10310 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
10320 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
10330 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e   SQL table.  pIn
10340 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20  dex is the name 
10350 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
10360 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74   and pTable is t
10370 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
10380 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
10390 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
103a0 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
103b0 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
103c0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
103d0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
103e0 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
103f0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
10400 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
10410 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
10420 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
10430 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
10440 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
10450 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
10460 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
10470 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
10480 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
10490 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
104a0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
104b0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
104c0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
104d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
104e0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
104f0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
10500 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
10510 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
10520 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
10530 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
10540 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
10550 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
10560 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
10570 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
10580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
10590 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
105a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
105b0 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
105c0 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
105d0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
105e0 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
105f0 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
10600 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
10610 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
10620 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
10630 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
10640 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
10650 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
10660 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54 61  pTblName,  /* Ta
10670 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
10680 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
10690 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
106a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
106b0 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
106c0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
106d0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
106e0 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f  rror,     /* OE_
106f0 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
10700 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
10710 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
10720 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f  ken *pStart,   /
10730 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
10740 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  en that begins a
10750 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10760 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
10770 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a  en *pEnd      /*
10780 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c   The ")" that cl
10790 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20  oses the CREATE 
107a0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
107b0 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
107c0 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62 6c  Tab = 0; /* Tabl
107d0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
107e0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
107f0 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69  ex = 0; /* The i
10800 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
10810 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
10820 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
10830 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
10840 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
10850 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
10860 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
10870 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
10880 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
10890 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
108a0 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
108b0 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20  int isTemp;     
108c0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74   /* True for a t
108d0 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a  emporary index *
108e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
108f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
10900 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
10910 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
10920 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
10930 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
10940 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
10950 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75  ame = 0; /* Unqu
10960 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
10970 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
10980 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ate */..  if( pP
10990 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
109a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
109b0 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
109c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
109d0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
109e0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
109f0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
10a00 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
10a10 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
10a20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
10a30 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
10a40 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
10a50 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
10a60 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
10a70 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
10a80 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
10a90 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
10aa0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
10ab0 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
10ac0 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
10ad0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
10ae0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
10af0 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
10b00 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
10b10 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
10b20 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
10b30 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
10b40 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
10b50 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10b60 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  dex;..    /* If 
10b70 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
10b80 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
10b90 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65  check if the the
10ba0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
10bb0 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
10bc0 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
10bd0 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20  tabase to 1..   
10be0 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73   */.    pTab = s
10bf0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
10c00 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
10c10 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
10c20 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
10c30 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
10c40 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b   pTab->iDb==1 ){
10c50 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a  .      iDb = 1;.
10c60 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
10c70 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
10c80 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
10c90 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
10ca0 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
10cb0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
10cc0 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
10cd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
10ce0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10cf0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
10d00 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
10d10 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
10d20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
10d30 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
10d40 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
10d50 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69  Database);.    i
10d60 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
10d70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10d80 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  x;.    assert( i
10d90 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b  Db==pTab->iDb );
10da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
10db0 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
10dc0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
10dd0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
10de0 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d  .    iDb = pTab-
10df0 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  >iDb;.  }..  if(
10e00 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
10e10 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
10e20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10e30 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
10e40 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
10e50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10e60 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
10e70 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
10e80 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
10e90 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
10ea0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10eb0 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
10ec0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
10ed0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10ee0 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
10ef0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
10f00 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
10f10 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10f20 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70    }.  isTemp = p
10f30 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20  Tab->iDb==1;..  
10f40 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
10f50 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
10f60 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
10f70 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
10f80 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
10f90 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
10fa0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
10fb0 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
10fc0 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
10fd0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
10fe0 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
10ff0 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
11000 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
11010 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
11020 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
11030 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
11040 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
11050 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
11060 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
11070 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
11080 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
11090 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
110a0 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
110b0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
110c0 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
110d0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
110e0 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
110f0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
11100 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
11110 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
11120 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
11130 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
11140 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
11150 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
11160 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
11170 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
11180 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
11190 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  en(pName);.    i
111a0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
111b0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
111c0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
111d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
111e0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
111f0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
11200 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11210 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
11220 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
11230 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
11240 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
11250 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11260 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
11270 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
11280 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
11290 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20  ex *pISameName; 
112a0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e     /* Another in
112b0 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d  dex with the sam
112c0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
112d0 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d  Table *pTSameNam
112e0 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65  e;    /* A table
112f0 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20   with same name 
11300 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  as the index */.
11310 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
11320 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
11330 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
11340 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11350 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  e_index;.      i
11360 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d  f( (pISameName =
11370 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
11380 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d  x(db, zName, db-
11390 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
113a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
113b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
113c0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
113d0 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
113e0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
113f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11400 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
11410 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
11420 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
11430 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
11440 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b  zName, 0))!=0 ){
11450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11460 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11470 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
11480 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
11490 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
114a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
114b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
114c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
114d0 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
114e0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
114f0 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
11500 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
11510 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
11520 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
11530 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
11540 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
11550 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
11560 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29  tf(zBuf,"_%d",n)
11570 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
11580 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
11590 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73  tring(&zName, "s
115a0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
115b0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
115c0 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
115d0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
115e0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
115f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
11600 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
11610 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
11620 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
11630 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
11640 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
11650 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
11660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
11670 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
11680 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
11690 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
116a0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
116b0 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
116c0 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
116d0 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
116e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
116f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11700 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
11710 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
11720 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20     if( isTemp ) 
11730 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
11740 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
11750 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11760 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
11770 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
11780 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
11790 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
117a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
117b0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
117c0 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
117d0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
117e0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
117f0 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
11800 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
11810 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
11820 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
11830 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
11840 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
11850 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
11860 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
11870 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
11880 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
11890 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
118a0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
118b0 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
118c0 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
118d0 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
118e0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
118f0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
11900 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
11910 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
11920 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11930 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
11940 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
11950 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
11960 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
11970 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
11980 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
11990 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a  ndex) + strlen(z
119a0 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20  Name) + 1 +.    
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29      (sizeof(int)
119d0 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   + sizeof(CollSe
119e0 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  q*))*pList->nExp
119f0 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  r );.  if( pInde
11a00 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  x==0 ) goto exit
11a10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11a20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
11a30 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
11a40 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
11a50 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
11a60 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
11a70 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
11a80 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
11a90 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72 63  ->nExpr];.  strc
11aa0 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
11ab0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
11ac0 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
11ad0 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
11ae0 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
11af0 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
11b00 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
11b10 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
11b20 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
11b30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
11b40 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
11b50 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
11b60 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11b70 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
11b80 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
11b90 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
11ba0 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
11bb0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
11bc0 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
11bd0 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
11be0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
11bf0 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
11c00 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
11c10 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  r; i++){.    for
11c20 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
11c30 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
11c40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11c50 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
11c60 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
11c70 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
11c80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11c90 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
11ca0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
11cb0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11cc0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
11cd0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
11ce0 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
11cf0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
11d00 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
11d10 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11d20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11d30 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
11d40 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
11d50 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
11d60 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20  a[i].pExpr ){.  
11d70 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
11d80 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
11d90 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49  Coll );.      pI
11da0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
11db0 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e  oll[i] = pList->
11dc0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
11dd0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
11de0 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
11df0 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
11e00 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
11e10 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ll;.    }.    as
11e20 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65  sert( pIndex->ke
11e30 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29  yInfo.aColl[i] )
11e40 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
11e50 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20  nit.busy && .   
11e60 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
11e70 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
11e80 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
11e90 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20  .aColl[i]) .    
11ea0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
11eb0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e  .    }.  }.  pIn
11ed0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
11ee0 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  eld = pList->nEx
11ef0 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  pr;..  if( pTab=
11f00 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
11f10 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
11f20 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
11f30 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
11f40 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
11f50 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
11f60 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
11f70 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
11f80 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
11f90 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
11fa0 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
11fb0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
11fc0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
11fd0 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
11fe0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
11ff0 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
12000 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
12010 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
12020 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
12030 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
12040 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
12050 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
12060 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
12070 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
12080 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
12090 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
120a0 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
120b0 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
120c0 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
120d0 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
120e0 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
120f0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
12100 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
12110 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
12120 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
12130 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
12140 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
12150 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
12160 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
12170 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
12180 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
12190 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
121a0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
121b0 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
121c0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
121d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
121e0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
121f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12200 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
12210 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
12220 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
12230 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
12240 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
12250 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
12260 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
12270 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
12280 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
12290 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
122a0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
122b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
122c0 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
122d0 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  l[k]!=pIndex->ke
122e0 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29  yInfo.aColl[k] )
122f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12300 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
12310 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
12320 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12330 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
12340 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
12350 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
12360 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
12370 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
12380 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
12390 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
123a0 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
123b0 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
123c0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
123d0 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
123e0 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
123f0 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
12400 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
12410 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
12420 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
12430 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
12440 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
12450 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
12460 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
12470 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
12480 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
12490 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
124a0 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
124b0 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
124c0 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
124d0 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
124e0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
124f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
12500 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
12510 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
12520 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
12530 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
12540 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
12550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
12560 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
12590 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
125a0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
125b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
125c0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
125d0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
125e0 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
125f0 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
12600 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
12610 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
12620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12630 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12640 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
12650 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12660 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
12670 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
12680 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
12690 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
126a0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
126b0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
126c0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
126d0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
126e0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
126f0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
12700 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
12710 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78  pIndex->iDb].idx
12720 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
12750 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
12760 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
12770 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
12780 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
12790 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
127a0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
127b0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f  iled */.      go
127c0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
127d0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
127e0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
127f0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
12800 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
12810 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
12820 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
12830 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
12840 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12850 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
12860 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
12870 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
12880 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
12890 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
128a0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
128b0 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
128c0 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
128d0 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
128e0 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
128f0 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
12900 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
12910 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
12920 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
12930 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
12940 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
12950 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
12960 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
12970 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
12980 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
12990 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
129a0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
129b0 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
129c0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
129d0 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
129e0 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
129f0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
12a00 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
12a10 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
12a20 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
12a30 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
12a40 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
12a50 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
12a60 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
12a70 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
12a80 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
12a90 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
12aa0 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
12ab0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
12ac0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
12ad0 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
12ae0 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
12af0 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
12b00 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
12b10 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
12b20 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
12b30 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
12b40 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
12b50 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
12b60 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
12b70 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
12b80 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
12b90 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20  Mem++;..    v = 
12ba0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12bb0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
12bc0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
12bd0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
12be0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
12bf0 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
12c00 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  he index.    */.
12c10 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12c20 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
12c30 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
12c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12c50 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
12c60 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b  eIndex, iDb, 0);
12c70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12c80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
12c90 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  tore, iMem, 0);.
12ca0 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
12cb0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
12cc0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
12cd0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
12ce0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
12cf0 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
12d00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
12d10 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
12d20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
12d30 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
12d40 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
12d50 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
12d60 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
12d70 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43  qlite3MPrintf("C
12d80 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
12d90 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
12da0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
12db0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
12dc0 20 20 20 20 20 20 20 20 41 64 64 72 28 70 45 6e          Addr(pEn
12dd0 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61  d->z) - Addr(pNa
12de0 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20  me->z) + 1,.    
12df0 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
12e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12e10 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
12e20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
12e30 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
12e40 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
12e50 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
12e60 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
12e70 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
12e80 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
12e90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
12ea0 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
12eb0 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
12ec0 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
12ed0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
12ee0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
12ef0 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
12f00 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
12f10 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
12f20 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20  Q,#0,%Q);",.    
12f30 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
12f40 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
12f50 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
12f60 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
12f70 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
12f80 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  zName,.        z
12f90 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
12fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12fb0 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
12fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
12fd0 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  e(zStmt);..    /
12fe0 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
12ff0 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
13000 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
13010 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  a.    */.    if(
13020 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
13030 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
13040 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
13050 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
13060 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
13070 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
13080 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
13090 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
130a0 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
130b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
130c0 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d  ite3MPrintf("nam
130d0 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d  e='%q'", pIndex-
130e0 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
130f0 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
13100 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
13110 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
13120 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
13130 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
13140 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
13150 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
13160 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
13170 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
13180 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
13190 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
131a0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
131b0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
131c0 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
131d0 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
131e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
131f0 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
13200 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
13210 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
13220 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
13230 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
13240 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
13250 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
13260 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
13270 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
13280 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
13290 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
132a0 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
132b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
132c0 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
132d0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
132e0 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
132f0 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
13300 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
13310 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
13320 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
13330 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
13340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
13350 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
13360 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
13370 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
13380 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
13390 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
133a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
133b0 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
133c0 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
133d0 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
133e0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65  Index ){.    fre
133f0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
13400 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
13410 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
13420 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
13430 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e  ListDelete(pTblN
13440 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
13450 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
13460 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
13470 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13480 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
13490 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
134a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
134b0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
134c0 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
134d0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
134e0 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
134f0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
13500 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ist *pName){.  I
13510 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
13520 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
13530 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13540 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
13550 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
13560 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
13570 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
13580 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
13590 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
135a0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
135b0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
135c0 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  e) ) return;.  p
135d0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
135e0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
135f0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
13600 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
13610 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
13620 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ndex==0 ){.    s
13630 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13640 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
13650 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
13660 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
13670 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
13680 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
13690 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
136a0 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
136b0 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
136c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
136d0 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
136e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
136f0 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
13700 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
13710 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
13720 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
13730 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13740 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
13750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13760 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
13770 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
13780 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13790 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
137a0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
137b0 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
137c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
137d0 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e  db->aDb[pIndex->
137e0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
137f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
13800 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
13810 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
13820 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13830 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13840 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
13850 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
13860 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
13870 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
13880 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
13890 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51  >iDb ) code = SQ
138a0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
138b0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
138c0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
138d0 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
138e0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
138f0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
13900 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13910 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
13920 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
13930 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13940 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
13950 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
13960 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
13970 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
13980 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13990 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
139a0 69 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78  int iDb = pIndex
139b0 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  ->iDb;.    sqlit
139c0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
139d0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
139e0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
139f0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
13a00 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
13a10 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
13a20 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
13a30 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
13a40 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
13a50 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
13a60 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20  e(db, v, iDb);. 
13a70 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
13a80 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
13a90 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
13aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
13ab0 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  3(v, OP_DropInde
13ac0 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65  x, iDb, 0, pInde
13ad0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
13ae0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
13af0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
13b00 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
13b10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  );.}../*.** Appe
13b20 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
13b30 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
13b40 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
13b50 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
13b60 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
13b70 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
13b80 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
13b90 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
13ba0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
13bb0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
13bc0 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
13bd0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
13be0 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
13bf0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
13c00 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
13c10 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
13c20 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
13c30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13c40 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
13c50 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
13c60 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74  List->nId>=pList
13c70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
13c80 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
13c90 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74  em *a;.    pList
13ca0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74  ->nAlloc = pList
13cb0 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  ->nAlloc*2 + 5;.
13cc0 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65      a = sqliteRe
13cd0 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
13ce0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69  pList->nAlloc*si
13cf0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
13d00 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ) );.    if( a==
13d10 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
13d20 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
13d30 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
13d40 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
13d50 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
13d60 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69   }.  memset(&pLi
13d70 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
13d80 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
13d90 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c  st->a[0]));.  pL
13da0 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
13db0 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  d].zName = sqlit
13dc0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
13dd0 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74  pToken);.  pList
13de0 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
13df0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
13e00 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
13e10 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
13e20 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
13e30 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
13e40 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
13e50 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
13e60 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
13e70 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
13e80 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
13e90 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  LL..**.** A new 
13ea0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
13eb0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
13ec0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
13ed0 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
13ee0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
13ef0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
13f00 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
13f10 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
13f20 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
13f30 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
13f40 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
13f50 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
13f60 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
13f70 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
13f80 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
13f90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13fa0 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
13fb0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
13fc0 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
13fd0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
13fe0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
13ff0 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
14000 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
14010 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
14020 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
14030 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
14040 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
14050 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
14060 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
14070 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
14080 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
14090 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
140a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
140b0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
140c0 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
140d0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
140e0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
140f0 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
14100 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
14110 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
14120 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
14130 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
14140 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
14150 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
14160 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
14170 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a  Append(A,B,C);.*
14180 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
14190 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
141a0 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
141b0 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63  ase name..*/.Src
141c0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
141d0 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69  ListAppend(SrcLi
141e0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
141f0 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20   *pTable, Token 
14200 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73  *pDatabase){.  s
14210 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
14220 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
14230 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
14240 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
14250 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72  alloc( sizeof(Sr
14260 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
14270 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14280 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
14290 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
142a0 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
142b0 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  Src>=pList->nAll
142c0 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
142d0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69  t *pNew;.    pLi
142e0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b  st->nAlloc *= 2;
142f0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
14300 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c  teRealloc(pList,
14310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14320 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b  sizeof(*pList) +
14330 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d   (pList->nAlloc-
14340 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  1)*sizeof(pList-
14350 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
14360 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
14370 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14380 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
14390 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
143a0 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
143b0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49  = pNew;.  }.  pI
143c0 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
143d0 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20  pList->nSrc];.  
143e0 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
143f0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
14400 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61  [0]));.  if( pDa
14410 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
14420 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
14430 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
14440 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
14450 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b  ase && pTable ){
14460 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
14470 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
14480 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
14490 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
144a0 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
144b0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
144c0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
144d0 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20  oken(pTable);.  
144e0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
144f0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
14500 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73  omToken(pDatabas
14510 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75  e);.  pItem->iCu
14520 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69  rsor = -1;.  pLi
14530 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65  st->nSrc++;.  re
14540 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
14550 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73  *.** Assign curs
14560 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ors to all table
14570 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
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 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
145a0 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
145b0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
145c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
145d0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
145e0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
145f0 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
14600 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20  iCursor<0 ){.   
14610 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69     pList->a[i].i
14620 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
14630 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nTab++;.    }. 
14640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
14650 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
14660 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
14670 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
14680 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
14690 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
146a0 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63  ListAddAlias(Src
146b0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
146c0 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
146d0 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
146e0 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
146f0 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
14700 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20  >nSrc-1].zAlias 
14710 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14720 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
14730 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
14740 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
14750 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
14760 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73  ListDelete(IdLis
14770 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
14780 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
14790 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
147a0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
147b0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
147c0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
147d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
147e0 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
147f0 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
14800 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
14810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14820 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
14830 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
14840 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
14850 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
14860 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
14870 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
14880 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
14890 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
148a0 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
148b0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
148c0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
148d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
148e0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
148f0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14900 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
14910 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
14920 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
14930 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
14940 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
14950 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
14960 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
14970 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
14980 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
14990 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
149a0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
149b0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
149c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
149d0 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
149e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
149f0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
14a00 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
14a10 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
14a20 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
14a30 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61  eFree(pItem->zDa
14a40 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
14a50 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
14a60 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
14a70 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c  eFree(pItem->zAl
14a80 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ias);.    if( pI
14a90 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49 74  tem->pTab && pIt
14aa0 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e  em->pTab->isTran
14ab0 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  sient ){.      s
14ac0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
14ad0 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  e(0, pItem->pTab
14ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14af0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
14b00 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
14b10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
14b20 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
14b30 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
14b40 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
14b50 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
14b60 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
14b70 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
14b80 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
14b90 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
14ba0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
14bb0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
14bc0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
14bd0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
14be0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
14bf0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
14c00 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
14c10 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
14c20 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
14c30 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
14c40 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
14c50 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
14c60 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
14c70 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14c80 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14c90 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
14ca0 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
14cb0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
14cc0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14cd0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
14ce0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
14cf0 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
14d00 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
14d10 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
14d20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14d30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14d40 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
14d50 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
14d60 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  IVE)+1);.    }. 
14d70 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
14d80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
14d90 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
14da0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
14db0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14dc0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
14dd0 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
14de0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14df0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14e00 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
14e10 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
14e20 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
14e30 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
14e40 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14e50 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
14e60 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
14e70 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
14e80 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
14e90 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14ea0 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
14eb0 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
14ec0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14ed0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14ee0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14ef0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
14f00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14f10 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
14f20 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
14f30 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
14f40 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14f50 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
14f60 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
14f70 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
14f80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
14f90 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
14fa0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
14fb0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
14fc0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
14fd0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
14fe0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
14ff0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
15000 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
15010 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15020 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15030 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
15040 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
15050 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
15060 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
15070 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15080 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
15090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
150a0 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
150b0 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
150c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
150d0 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
150e0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
150f0 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
15100 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
15110 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
15120 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
15130 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
15140 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
15150 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
15160 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  ic int sqlite3Op
15170 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
15180 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
15190 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
151a0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
151b0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
151c0 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
151d0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
151e0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
151f0 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
15200 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
15210 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
15220 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15240 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15250 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
15260 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
15270 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
15280 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
15290 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
152a0 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
152b0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
152c0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
152d0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
152e0 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
152f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
15300 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15310 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
15320 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
15330 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 1);.      if
15340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15350 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15360 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15370 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
15380 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
15390 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
153a0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
153b0 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
153c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
153d0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
153e0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
153f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15400 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
15410 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
15420 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
15430 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
15440 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
15450 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
15460 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
15470 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
15480 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
15490 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
154a0 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
154b0 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
154c0 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
154d0 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
154e0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
154f0 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
15500 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
15510 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
15520 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
15530 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
15540 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
15550 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
15560 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
15570 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
15580 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15590 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
155a0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
155b0 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
155c0 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
155d0 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
155e0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
155f0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
15600 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
15610 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
15620 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
15630 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
15640 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
15650 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
15660 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
15670 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
15680 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
15690 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
156a0 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
156b0 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
156c0 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
156d0 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
156e0 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
156f0 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
15700 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
15710 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
15720 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
15730 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
15740 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
15750 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
15760 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
15770 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
15780 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
15790 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
157a0 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
157b0 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
157c0 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
157d0 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
157e0 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
157f0 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
15800 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
15810 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
15820 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
15830 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
15840 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
15850 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
15860 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
15870 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
15880 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
15890 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
158a0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
158b0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
158c0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
158d0 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
158e0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
158f0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
15900 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
15910 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
15920 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
15930 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
15940 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
15950 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
15960 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
15970 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
15980 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
15990 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
159a0 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
159b0 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
159c0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
159d0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
159e0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
159f0 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
15a00 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
15a10 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20  rt( iDb<32 );.  
15a20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
15a30 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
15a40 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
15a50 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
15a60 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
15a70 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
15a80 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
15a90 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
15aa0 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
15ab0 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
15ac0 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
15ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
15ae0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
15af0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
15b00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15b10 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
15b20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
15b30 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
15b40 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
15b50 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
15b60 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
15b70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15b80 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
15b90 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
15ba0 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
15bb0 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
15bc0 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
15bd0 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
15be0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
15bf0 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
15c00 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
15c10 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
15c20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
15c30 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
15c40 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
15c50 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
15c60 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
15c70 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
15c80 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
15c90 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
15ca0 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
15cb0 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
15cc0 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
15cd0 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
15ce0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
15cf0 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
15d00 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
15d10 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
15d20 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
15d30 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
15d40 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
15d50 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
15d60 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
15d70 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
15d80 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
15d90 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
15da0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
15db0 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
15dc0 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
15dd0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
15de0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
15df0 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
15e00 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
15e10 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
15e20 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
15e30 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
15e40 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
15e50 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
15e60 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
15e70 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
15e80 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
15e90 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
15ea0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
15eb0 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
15ec0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
15ed0 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
15ee0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
15ef0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15f00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15f10 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
15f20 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
15f30 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
15f40 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15f50 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
15f60 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
15f70 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
15f80 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
15f90 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
15fa0 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
15fb0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
15fc0 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
15fd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15fe0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15ff0 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
16000 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   0);.  }.  if( i
16010 44 62 21 3d 31 20 26 26 20 70 50 61 72 73 65 2d  Db!=1 && pParse-
16020 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21  >db->aDb[1].pBt!
16030 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16040 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
16050 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74  tion(pParse, set
16060 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20  Statement, 1);. 
16070 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74   }.}../* .** Ret
16080 75 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e  urn the transien
16090 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t sqlite3_value 
160a0 6f 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20  object used for 
160b0 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73  encoding convers
160c0 69 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53  ions.** during S
160d0 51 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a  QL compilation..
160e0 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
160f0 20 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e   *sqlite3GetTran
16100 73 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74  sientValue(sqlit
16110 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21  e3 *db){.  if( !
16120 64 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20  db->pValue ){.  
16130 20 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73    db->pValue = s
16140 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
16150 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
16160 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 0a 2f 2a  b->pValue;.}../*
16170 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
16180 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
16190 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
161a0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
161b0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
161c0 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
161d0 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
161e0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
161f0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
16200 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
16210 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c 6c  lationMatch(Coll
16220 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64 65  Seq *pColl, Inde
16230 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
16240 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65  t n = pIndex->ke
16250 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20 20  yInfo.nField;.  
16260 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20 70  CollSeq **pp = p
16270 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
16280 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Coll;.  while( n
16290 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 70  -- ){.    if( *p
162a0 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75 72  p==pColl ) retur
162b0 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a 20  n 1;.    pp++;. 
162c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
162d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
162e0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
162f0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
16300 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
16310 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
16320 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
16330 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
16340 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
16350 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
16360 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
16370 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e 64  INDEX.void reind
16380 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
16390 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
163a0 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ab, CollSeq *pCo
163b0 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
163c0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
163d0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
163e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
163f0 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
16400 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
16410 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
16420 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
16430 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d  {.    if( pColl=
16440 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
16450 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65  atch(pColl,pInde
16460 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x) ){.      sqli
16470 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16480 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
16490 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
164a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
164b0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
164c0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
164d0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
164e0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
164f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
16500 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
16510 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
16520 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
16530 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
16540 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
16550 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
16560 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
16570 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
16580 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
16590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
165a0 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69  REINDEX.void rei
165b0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
165c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
165d0 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
165e0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
165f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16600 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
16610 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
16640 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
16650 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
16660 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
16670 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
16680 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16690 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
166a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
166b0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
166c0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
166d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
166f0 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
16700 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
16710 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
16720 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
16730 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
16740 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d  +){.    if( pDb=
16750 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
16760 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74       for(k=sqlit
16770 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
16780 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
16790 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
167a0 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
167b0 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
167c0 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
167d0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
167e0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43  pParse, pTab, pC
167f0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
16800 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16810 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
16820 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
16830 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
16840 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
16870 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
16880 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
16890 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
168a0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
168b0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
168c0 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
168d0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
168e0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
168f0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
16900 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
16910 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
16920 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
16930 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
16940 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
16950 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
16960 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
16970 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
16980 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
16990 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
169a0 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
169b0 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
169c0 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
169d0 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
169e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
169f0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
16a00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16a10 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
16a20 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
16a30 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
16a40 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
16a50 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
16a60 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
16a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16a80 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
16a90 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
16aa0 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
16ab0 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ad0 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
16ae0 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
16af0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
16b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16b10 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
16b20 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
16b30 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
16b40 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
16b50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
16b60 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
16b70 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
16b80 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
16b90 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
16ba0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
16bd0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
16be0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
16bf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
16c00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
16c10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16c20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
16c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16c40 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
16c50 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
16c60 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
16c70 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c  if( pName1==0 ||
16c80 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b   pName1->z==0 ){
16c90 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
16ca0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
16cb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
16cc0 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
16cd0 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  ==0 || pName2->z
16ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ==0 ){.    pColl
16cf0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
16d00 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65 6e  llSeq(db, db->en
16d10 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e  c, pName1->z, pN
16d20 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  ame1->n, 0);.   
16d30 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
16d40 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
16d50 61 73 65 73 28 70 50 61 72 73 65 2c 20 70 43 6f  ases(pParse, pCo
16d60 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
16d70 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
16d80 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
16d90 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
16da0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
16db0 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
16dc0 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
16dd0 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
16de0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62  ameFromToken(pOb
16df0 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20  jName);.  zDb = 
16e00 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
16e10 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
16e20 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
16e30 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
16e40 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
16e50 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
16e60 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
16e70 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
16e80 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
16e90 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
16ea0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
16eb0 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
16ec0 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70  Free(z);.  if( p
16ed0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
16ee0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16ef0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16f00 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
16f10 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
16f20 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
16f30 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
16f40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
16f50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16f60 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
16f70 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
16f80 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
16f90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
16fa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16fb0 4c 54 45 52 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  LTERTABLE./*.** 
16fc0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16fd0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22   implement the "
16fe0 41 4c 54 45 52 20 54 41 42 4c 45 20 78 78 78 20  ALTER TABLE xxx 
16ff0 52 45 4e 41 4d 45 20 54 4f 20 79 79 79 22 20 0a  RENAME TO yyy" .
17000 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  ** command. .*/.
17010 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65  void sqlite3Alte
17020 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 0a 20 20  rRenameTable(.  
17030 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
17050 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a  ser context. */.
17060 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
17070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17080 68 65 20 74 61 62 6c 65 20 74 6f 20 72 65 6e 61  he table to rena
17090 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  me. */.  Token *
170a0 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  pName           
170b0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
170c0 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 29 7b 0a  ble name. */.){.
170d0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
170e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
170f0 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
17100 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
17110 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
17120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17130 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 72 65  * Table being re
17140 6e 61 6d 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  named */.  sqlit
17150 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17160 3e 64 62 3b 20 2f 2a 20 44 61 74 61 62 61 73 65  >db; /* Database
17170 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
17180 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
17190 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 55  ;          /* NU
171a0 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20 76 65  LL-terminated ve
171b0 72 73 69 6f 6e 20 6f 66 20 70 4e 61 6d 65 20 2a  rsion of pName *
171c0 2f 20 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  / .  char *zWher
171d0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  e = 0;         /
171e0 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20 6f  * Where clause o
171f0 66 20 73 63 68 65 6d 61 20 65 6c 65 6d 65 6e 74  f schema element
17200 73 20 74 6f 20 72 65 70 61 72 73 65 20 2a 2f 0a  s to reparse */.
17210 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 0a 20 20    Vdbe *v;.  .  
17220 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53  assert( pSrc->nS
17230 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 70 54 61 62  rc==1 );..  pTab
17240 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
17250 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53  Table(pParse, pS
17260 72 63 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  rc->a[0].zName, 
17270 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  pSrc->a[0].zData
17280 62 61 73 65 29 3b 0a 20 20 69 66 28 20 21 70 54  base);.  if( !pT
17290 61 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ab ) return;.  i
172a0 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
172b0 0a 20 20 2f 2a 20 47 65 74 20 61 20 4e 55 4c 4c  .  /* Get a NULL
172c0 20 74 65 72 6d 69 6e 61 74 65 64 20 76 65 72 73   terminated vers
172d0 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
172e0 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  able name. */.  
172f0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
17300 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
17310 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 4e 61 6d  me);.  if( !zNam
17320 65 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  e ) return;..  /
17330 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 20 74  * Check that a t
17340 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 6e 61  able or index na
17350 6d 65 64 20 27 7a 4e 61 6d 65 27 20 64 6f 65 73  med 'zName' does
17360 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
17370 73 74 0a 20 20 2a 2a 20 69 6e 20 64 61 74 61 62  st.  ** in datab
17380 61 73 65 20 69 44 62 2e 20 49 66 20 73 6f 2c 20  ase iDb. If so, 
17390 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
173a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
173b0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
173c0 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
173d0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 7c 7c 0a  [iDb].zName) ||.
173e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6e        sqlite3Fin
173f0 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
17400 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
17410 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  Name) ){.    sql
17420 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17430 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 74  rse, .        "t
17440 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
17450 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72  another table or
17460 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 69 73   index with this
17470 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d   name: %s", zNam
17480 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
17490 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
174a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
174b0 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
174c0 74 69 6f 6e 20 61 6e 64 20 63 6f 64 65 20 74 68  tion and code th
174d0 65 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 66  e VerifyCookie f
174e0 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  or database iDb.
174f0 20 0a 20 20 2a 2a 20 54 68 65 6e 20 6d 6f 64 69   .  ** Then modi
17500 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
17510 6f 6b 69 65 20 28 73 69 6e 63 65 20 74 68 65 20  okie (since the 
17520 41 4c 54 45 52 20 54 41 42 4c 45 20 6d 6f 64 69  ALTER TABLE modi
17530 66 69 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 63  fies the.  ** sc
17540 68 65 6d 61 29 2e 0a 20 20 2a 2f 0a 20 20 76 20  hema)..  */.  v 
17550 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
17560 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
17570 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
17580 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
17590 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
175a0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 73  se, 0, iDb);.  s
175b0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
175c0 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
175d0 0a 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65  .  /* Modify the
175e0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
175f0 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
17600 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  new table name. 
17610 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
17620 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
17630 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
17640 2e 25 73 20 53 45 54 20 22 0a 20 20 20 20 20 20  .%s SET ".      
17650 20 20 20 20 22 73 71 6c 20 3d 20 73 71 6c 69 74      "sql = sqlit
17660 65 5f 61 6c 74 65 72 5f 74 61 62 6c 65 28 73 71  e_alter_table(sq
17670 6c 2c 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20  l, %Q), ".      
17680 20 20 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20      "tbl_name = 
17690 25 51 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %Q, ".          
176a0 22 6e 61 6d 65 20 3d 20 43 41 53 45 20 22 0a 20  "name = CASE ". 
176b0 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45 4e             "WHEN
176c0 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 54 48   type='table' TH
176d0 45 4e 20 25 51 20 22 0a 20 20 20 20 20 20 20 20  EN %Q ".        
176e0 20 20 20 20 22 57 48 45 4e 20 6e 61 6d 65 20 4c      "WHEN name L
176f0 49 4b 45 20 27 73 71 6c 69 74 65 5f 61 75 74 6f  IKE 'sqlite_auto
17700 69 6e 64 65 78 25 25 27 20 41 4e 44 20 74 79 70  index%%' AND typ
17710 65 3d 27 69 6e 64 65 78 27 20 54 48 45 4e 20 22  e='index' THEN "
17720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
17730 27 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  'sqlite_autoinde
17740 78 5f 27 20 7c 7c 20 25 51 20 7c 7c 20 73 75 62  x_' || %Q || sub
17750 73 74 72 28 6e 61 6d 65 2c 20 25 64 2b 31 38 2c  str(name, %d+18,
17760 31 30 29 20 22 0a 20 20 20 20 20 20 20 20 20 20  10) ".          
17770 20 20 22 45 4c 53 45 20 6e 61 6d 65 20 45 4e 44    "ELSE name END
17780 20 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20   ".      "WHERE 
17790 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 41 4e 44 20  tbl_name=%Q AND 
177a0 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27  type IN ('table'
177b0 2c 20 27 69 6e 64 65 78 27 29 3b 22 2c 20 0a 20  , 'index');", . 
177c0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
177d0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
177e0 54 41 42 4c 45 28 69 44 62 29 2c 20 7a 4e 61 6d  TABLE(iDb), zNam
177f0 65 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  e, zName, zName,
17800 20 0a 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73   .      zName, s
17810 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d  trlen(pTab->zNam
17820 65 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  e), pTab->zName.
17830 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 72 6f 70 20    );..  /* Drop 
17840 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
17850 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 63  the in-memory sc
17860 68 65 6d 61 20 74 68 61 74 20 72 65 66 65 72 65  hema that refere
17870 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 0a 20  d to the table. 
17880 20 2a 2a 20 72 65 6e 61 6d 65 64 20 61 6e 64 20   ** renamed and 
17890 6c 6f 61 64 20 74 68 65 20 6e 65 77 20 76 65 72  load the new ver
178a0 73 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20 64  sions from the d
178b0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
178c0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
178d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
178e0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
178f0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
17900 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
17910 30 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d  0);.    zWhere =
17920 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
17930 22 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 2c 20 7a  "tbl_name=%Q", z
17940 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
17950 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
17960 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
17970 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 33 5f  , 0, zWhere, P3_
17980 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 20  DYNAMIC);.  }.. 
17990 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
179a0 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a        e);.}.#endif..