/ Hex Artifact Content
Login

Artifact 27897ee30d914e503cc948370858ed54c940d4bf:


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 38 32 20 32 30 30 34 2f 31 31 2f 31 39  1.282 2004/11/19
02f0: 20 30 37 3a 30 37 3a 33 31 20 64 61 6e 69 65 6c   07:07: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 28 6e 61 6d  ite_sequence(nam
b900: 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
b910: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
b920: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
b930: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
b940: 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
b950: 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
b960: 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
b970: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
b980: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
b990: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
b9a0: 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c  eSchema, p->iDb,
b9b0: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
b9c0: 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f  te3MPrintf("tbl_
b9d0: 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e  name='%q'",p->zN
b9e0: 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
b9f0: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
ba00: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
ba10: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
ba20: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
ba30: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
ba40: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
ba50: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
ba60: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
ba70: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
ba80: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20   FKey *pFKey; . 
ba90: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
baa0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20  ->aDb[p->iDb];. 
bab0: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
bac0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
bad0: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
bae0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
baf0: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
bb00: 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
bb10: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
bb20: 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
bb30: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
bb40: 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
bb50: 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72  ert() */.      r
bb60: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
bb70: 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46   for(pFKey=p->pF
bb80: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
bb90: 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  y=pFKey->pNextFr
bba0: 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  om){.      int n
bbb0: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65  To = strlen(pFKe
bbc0: 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  y->zTo) + 1;.   
bbd0: 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
bbe0: 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  o = sqlite3HashF
bbf0: 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c  ind(&pDb->aFKey,
bc00: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
bc10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bc20: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
bc30: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
bc40: 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b  To, nTo, pFKey);
bc50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
bc60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
bc70: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
bc80: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
bc90: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
bca0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
bcb0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
bcc0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
bcd0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
bce0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
bcf0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
bd00: 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
bd10: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
bd20: 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
bd30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
bd40: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
bd50: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
bd60: 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
bd70: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
bd80: 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
bd90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
bda0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
bdb0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
bdc0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
bdd0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
bde0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
bdf0: 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
be00: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
be10: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
be20: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
be30: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
be40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
be50: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
be60: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
be70: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  */.  int isTemp 
be80: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
be90: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
bea0: 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  view */.){.  Tab
beb0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
bec0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
bed0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
bee0: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
bef0: 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
bf00: 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74  *pName;..  sqlit
bf10: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
bf20: 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61  rse, pBegin, pNa
bf30: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54  me1, pName2, isT
bf40: 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70  emp, 1);.  p = p
bf50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bf60: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
bf70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
bf80: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
bf90: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
bfa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bfb0: 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  }.  sqlite3TwoPa
bfc0: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
bfd0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
bfe0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
bff0: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
c000: 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69  ix, pParse, p->i
c010: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
c020: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
c030: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
c040: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
c050: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c060: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
c070: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c080: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
c090: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
c0a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c0b0: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
c0c0: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
c0d0: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
c0e0: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
c0f0: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
c100: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
c110: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
c120: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
c130: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
c140: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
c150: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
c160: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
c170: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
c180: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
c190: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
c1a0: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
c1b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
c1c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
c1d0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c1e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
c1f0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
c200: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
c210: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
c220: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
c230: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
c240: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
c250: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
c260: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
c270: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
c280: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
c290: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
c2a0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
c2b0: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
c2c0: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
c2d0: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
c2e0: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
c2f0: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
c300: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
c310: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
c320: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
c330: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
c340: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
c350: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
c360: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
c370: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
c380: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
c390: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
c3a0: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
c3b0: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
c3c0: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
c3d0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
c3e0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
c3f0: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
c400: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
c410: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
c420: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c430: 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EW */..#ifndef S
c440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c450: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
c460: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
c470: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
c480: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
c490: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
c4a0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
c4b0: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
c4c0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
c4d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
c4e0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
c4f0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
c500: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
c510: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
c520: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
c530: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
c540: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
c550: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
c560: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
c570: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c580: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
c590: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  ;.  Table *pSelT
c5a0: 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ab;.  int nErr =
c5b0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
c5c0: 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  Table );..  /* A
c5d0: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
c5e0: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
c5f0: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
c600: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
c610: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
c620: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
c630: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
c640: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
c650: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
c660: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
c670: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
c680: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
c690: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
c6a0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
c6b0: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
c6c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
c6d0: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
c6e0: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
c6f0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
c700: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
c710: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
c720: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
c730: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
c740: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
c750: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
c760: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
c770: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
c780: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
c790: 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73  y, this error is
c7a0: 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73   caught previous
c7b0: 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f  ly and so the fo
c7c0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a  llowing test.  *
c7d0: 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  * should always 
c7e0: 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69  fail.  But we wi
c7f0: 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70  ll leave it in p
c800: 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20  lace just to be 
c810: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  safe..  */.  if(
c820: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
c830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c840: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c850: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
c860: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
c870: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
c880: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c890: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  }..  /* If we ge
c8a0: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
c8b0: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
c8c0: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
c8d0: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
c8e0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
c8f0: 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66  pSelect ); /* If
c900: 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70   nCol==0, then p
c910: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20  Table must be a 
c920: 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d  VIEW */.  pSel =
c930: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
c940: 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
c950: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
c960: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
c970: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
c980: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
c990: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
c9a0: 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65  is list.  But we
c9b0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65   will need to re
c9c0: 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20  store the list. 
c9d0: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
c9e0: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
c9f0: 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64  ration afterward
ca00: 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61 20  s, so we save a 
ca10: 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65  copy of.  ** the
ca20: 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c   original in pEL
ca30: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69  ist..  */.  pELi
ca40: 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73  st = pSel->pELis
ca50: 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  t;.  pSel->pELis
ca60: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
ca70: 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a  istDup(pEList);.
ca80: 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69    if( pSel->pELi
ca90: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65  st==0 ){.    pSe
caa0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
cab0: 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  st;.    return 1
cac0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69  ;  /* Malloc fai
cad0: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61  led */.  }.  pTa
cae0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
caf0: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
cb00: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
cb10: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
cb20: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
cb30: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
cb40: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
cb50: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
cb60: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
cb70: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
cb80: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
cb90: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
cba0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
cbb0: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
cbc0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
cbd0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
cbe0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
cbf0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70   DbSetProperty(p
cc00: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c  Parse->db, pTabl
cc10: 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73  e->iDb, DB_Unres
cc20: 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73  etViews);.  }els
cc30: 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  e{.    pTable->n
cc40: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72  Col = 0;.    nEr
cc50: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r++;.  }.  sqlit
cc60: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  e3SelectUnbind(p
cc70: 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Sel);.  sqlite3E
cc80: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
cc90: 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  el->pEList);.  p
cca0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
ccb0: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  List;.  return n
ccc0: 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
ccd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
cce0: 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  IEW */..#ifndef 
ccf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
cd00: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
cd10: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
cd20: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
cd30: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
cd40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
cd50: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
cd60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
cd70: 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
cd80: 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62  em *i;.  if( !Db
cd90: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
cda0: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
cdb0: 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
cdc0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
cdd0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
cde0: 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20  [idx].tblHash); 
cdf0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
ce00: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
ce10: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
ce20: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
ce30: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
ce40: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
ce50: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
ce60: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
ce70: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
ce80: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
ce90: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
cea0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
ceb0: 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
cec0: 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
ced0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cee0: 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
cef0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
cf00: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
cf10: 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
cf20: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
cf30: 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
cf40: 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
cf50: 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
cf60: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
cf70: 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
cf80: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
cf90: 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
cfa0: 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
cfb0: 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
cfc0: 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e   to iTo..*/.#ifn
cfd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cfe0: 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
cff0: 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
d000: 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e  oved(Db *pDb, in
d010: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
d020: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
d030: 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72 28 70  Elem;.  .  for(p
d040: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
d050: 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  irst(&pDb->tblHa
d060: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
d070: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
d080: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
d090: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
d0a0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
d0b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
d0c0: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
d0d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
d0e0: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65   = iTo;.      re
d0f0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
d100: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
d110: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
d120: 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45 6c 65  ->idxHash); pEle
d130: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
d140: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
d150: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
d160: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
d170: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
d180: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
d190: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
d1a0: 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
d1b0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d1c0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
d1d0: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0);.}.#endif../*
d1e0: 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
d1f0: 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
d200: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
d210: 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
d220: 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
d230: 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
d240: 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
d250: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d260: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
d270: 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
d280: 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
d290: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
d2a0: 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
d2b0: 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
d2c0: 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
d2d0: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
d2e0: 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
d2f0: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
d300: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
d310: 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
d320: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
d330: 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
d340: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
d350: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
d360: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
d370: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
d380: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69  stroy, iTable, i
d390: 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Db);.#ifndef SQL
d3a0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d3b0: 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
d3c0: 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e  roy pushes an in
d3d0: 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73  teger onto the s
d3e0: 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e  tack. If this in
d3f0: 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
d400: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
d410: 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
d420: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
d430: 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
d440: 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
d450: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
d460: 63 6f 64 65 20 6d 6f 64 69 66 69 73 20 74 68 65  code modifis the
d470: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d480: 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
d490: 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
d4a0: 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e    ** The "#0" in
d4b0: 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
d4c0: 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
d4d0: 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
d4e0: 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
d4f0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
d500: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73  he stack.  See s
d510: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
d520: 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  pr()..  */.  sql
d530: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
d540: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
d550: 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
d560: 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
d570: 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67  E #0 AND rootpag
d580: 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72  e=#0",.     pPar
d590: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
d5a0: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
d5b0: 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
d5c0: 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  e);.#endif.}../*
d5d0: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
d5e0: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
d5f0: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
d600: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
d610: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
d620: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
d630: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d640: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
d650: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
d660: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
d670: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
d680: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
d690: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
d6a0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
d6b0: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
d6c0: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
d6d0: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
d6e0: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
d6f0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
d700: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
d710: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
d720: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
d730: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
d740: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
d750: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 64 65  ndex *pIdx;.  de
d760: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
d770: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
d780: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
d790: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d7a0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d7b0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d7c0: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
d7d0: 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
d7e0: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44  ->tnum, pIdx->iD
d7f0: 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
d800: 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
d810: 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
d820: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
d830: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d840: 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
d850: 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
d860: 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
d870: 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
d880: 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
d890: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
d8a0: 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
d8b0: 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
d8c0: 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
d8d0: 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
d8e0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
d8f0: 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
d900: 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
d910: 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
d920: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
d930: 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
d940: 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
d950: 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
d960: 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
d970: 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
d980: 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
d990: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
d9a0: 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
d9b0: 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
d9c0: 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
d9d0: 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
d9e0: 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
d9f0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
da00: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
da10: 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
da20: 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
da30: 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
da40: 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
da50: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
da60: 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
da70: 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
da80: 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
da90: 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
daa0: 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
dab0: 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
dac0: 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
dad0: 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
dae0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
daf0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
db00: 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
db10: 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
db20: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
db30: 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
db40: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
db50: 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
db60: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
db70: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
db80: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
db90: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
dba0: 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
dbb0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
dbc0: 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20  >iDb==pTab->iDb 
dbd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
dbe0: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
dbf0: 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
dc00: 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
dc10: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
dc20: 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
dc30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dc40: 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
dc50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
dc60: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
dc70: 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
dc80: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
dc90: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c   iDestroyed = iL
dca0: 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64  argest;.  }.#end
dcb0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
dcc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
dcd0: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
dce0: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
dcf0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
dd00: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
dd10: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
dd20: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
dd30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
dd40: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
dd50: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
dd60: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
dd70: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
dd80: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
dd90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
dda0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
ddb0: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
ddc0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
ddd0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
dde0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
ddf0: 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72  p_table;.  asser
de00: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
de10: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
de20: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
de30: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
de40: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
de50: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
de60: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
de70: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  =0 ) goto exit_d
de80: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62  rop_table;.  iDb
de90: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
dea0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
deb0: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
dec0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ded0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
dee0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
def0: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
df00: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
df10: 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69  MA_TABLE(pTab->i
df20: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
df30: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
df40: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
df50: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
df60: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
df70: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
df80: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
df90: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
dfa0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
dfb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
dfc0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
dfd0: 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
dfe0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
dff0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
e000: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
e010: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e020: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
e030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e040: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44  se{.      if( iD
e050: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
e060: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e070: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
e080: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e090: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
e0a0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
e0b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e0c0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
e0d0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
e0e0: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
e0f0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
e100: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e110: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
e120: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
e130: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
e140: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
e150: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
e160: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
e170: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e190: 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  f.  if( pTab->re
e1a0: 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d  adOnly || pTab==
e1b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65  db->aDb[iDb].pSe
e1c0: 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  qTab ){.    sqli
e1d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e1e0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
e1f0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
e200: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
e210: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e220: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
e230: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
e240: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
e250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e260: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
e270: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
e280: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
e290: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
e2a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
e2b0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
e2c0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
e2d0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
e2e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e2f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
e300: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
e310: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
e320: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e330: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e340: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  p_table;.  }..  
e350: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e360: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
e370: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
e380: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
e390: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
e3a0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e3b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
e3c0: 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67  ( v ){.    Trigg
e3d0: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
e3e0: 20 20 69 6e 74 20 69 44 62 20 3d 20 70 54 61 62    int iDb = pTab
e3f0: 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62 20 2a 70  ->iDb;.    Db *p
e400: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
e410: 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  b];.    sqlite3B
e420: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
e430: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
e440: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  b);..    /* Drop
e450: 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
e460: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
e470: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
e480: 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20  opped. Code.    
e490: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
e4a0: 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
e4b0: 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
e4c0: 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20  ster and/or.    
e4d0: 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
e4e0: 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
e4f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  d..    */.    pT
e500: 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
e510: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69  Trigger;.    whi
e520: 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
e530: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e540: 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 69 44 62  rigger->iDb==iDb
e550: 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44   || pTrigger->iD
e560: 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  b==1 );.      sq
e570: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
e580: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
e590: 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  gger, 1);.      
e5a0: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
e5b0: 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
e5c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e5d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
e5e0: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  MENT.    /* Remo
e5f0: 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
e600: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
e610: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
e620: 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
e630: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
e640: 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
e650: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
e660: 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
e670: 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74  pped.    ** at t
e680: 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
e690: 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
e6a0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
e6b0: 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  e needs to.    *
e6c0: 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
e6d0: 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
e6e0: 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
e6f0: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
e700: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e710: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  pTab->autoInc ){
e720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
e730: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
e740: 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
e750: 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65  E FROM %s.sqlite
e760: 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
e770: 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
e780: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
e790: 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ab->zName.      
e7a0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
e7b0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
e7c0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
e7d0: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
e7e0: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
e7f0: 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  r to the.    ** 
e800: 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
e810: 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
e820: 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
e830: 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
e840: 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  es.    ** every 
e850: 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
e860: 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
e870: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
e880: 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20  he one being.   
e890: 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
e8a0: 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
e8b0: 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63  d seperately bec
e8c0: 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
e8d0: 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  an be.    ** cre
e8e0: 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
e8f0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
e900: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
e910: 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20   in another.    
e920: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
e930: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
e940: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
e950: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c  e, .        "DEL
e960: 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
e970: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
e980: 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
e990: 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70  ger'",.        p
e9a0: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
e9b0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
e9c0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
e9d0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
e9e0: 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c       destroyTabl
e9f0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
ea00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
ea10: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
ea20: 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
ea30: 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
ea40: 65 6d 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ema.    */.    s
ea50: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
ea60: 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
ea70: 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  Db, 0, pTab->zNa
ea80: 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  me, 0);.  }.  sq
ea90: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
eaa0: 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
eab0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
eac0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
ead0: 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
eae0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
eaf0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
eb00: 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
eb10: 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
eb20: 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
eb30: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
eb40: 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
eb50: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
eb60: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
eb70: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
eb80: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
eb90: 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
eba0: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
ebb0: 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
ebc0: 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
ebd0: 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
ebe0: 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
ebf0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
ec00: 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
ec10: 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
ec20: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
ec30: 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
ec40: 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
ec50: 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
ec60: 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
ec70: 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
ec80: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
ec90: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
eca0: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
ecb0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
ecc0: 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
ecd0: 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
ece0: 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
ecf0: 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
ed00: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
ed10: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
ed20: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
ed30: 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
ed40: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
ed50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ed60: 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e  le field.  The n
ed70: 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f  ew FKey.** is no
ed80: 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62  t linked into db
ed90: 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20  ->aFKey at this 
eda0: 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65  point - that doe
edb0: 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20  s not happen.** 
edc0: 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64  until sqlite3End
edd0: 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Table()..**.** T
ede0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
edf0: 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
ee00: 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
ee10: 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
ee20: 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
ee30: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
ee40: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
ee50: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
ee60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ee70: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
ee80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ee90: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
eea0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
eeb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
eec0: 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
eed0: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
eee0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
eef0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
ef00: 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
ef10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
ef20: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
ef30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
ef40: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
ef50: 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
ef60: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
ef70: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
ef80: 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
ef90: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
efa0: 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  s. */.){.#ifndef
efb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
efc0: 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
efd0: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
efe0: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
eff0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
f000: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
f010: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
f020: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
f030: 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
f040: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
f050: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
f060: 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
f070: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
f080: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
f090: 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  Col-1;.    if( i
f0a0: 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f  Col<0 ) goto fk_
f0b0: 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
f0c0: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
f0d0: 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
f0e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f0f0: 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
f100: 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
f110: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
f120: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
f130: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
f140: 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
f150: 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
f160: 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
f170: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f180: 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
f190: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
f1a0: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
f1b0: 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
f1c0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
f1d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f1e0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
f1f0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f200: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
f210: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
f220: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
f230: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
f240: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
f250: 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
f260: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
f270: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
f280: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
f290: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
f2a0: 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
f2b0: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65  nCol*sizeof(pFKe
f2c0: 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
f2d0: 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
f2e0: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
f2f0: 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
f300: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
f310: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
f320: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
f330: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
f340: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
f350: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
f360: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
f370: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
f380: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
f390: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
f3a0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
f3b0: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
f3c0: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
f3d0: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
f3e0: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
f3f0: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
f400: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
f410: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
f420: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
f430: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
f440: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
f450: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
f460: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
f470: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
f480: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
f490: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
f4a0: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
f4b0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
f4c0: 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
f4d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
f4e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
f4f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
f500: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
f510: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
f520: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
f530: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
f540: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
f550: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
f560: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
f570: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
f580: 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
f590: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f5b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
f5c0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
f5d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f5e0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
f5f0: 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
f600: 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
f610: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
f620: 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
f630: 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
f640: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
f650: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
f660: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f670: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
f680: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f690: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f6a0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
f6b0: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
f6c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
f6d0: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
f6e0: 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
f6f0: 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
f700: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
f710: 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
f720: 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
f730: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
f740: 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
f750: 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
f760: 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
f770: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
f780: 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
f790: 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
f7a0: 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
f7b0: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
f7c0: 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
f7d0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
f7e0: 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
f7f0: 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
f800: 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
f810: 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
f820: 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
f830: 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
f840: 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  ee(pFKey);.#endi
f850: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
f860: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f870: 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
f880: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
f890: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
f8a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
f8b0: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
f8c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f8d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
f8e0: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
f8f0: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
f900: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
f910: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
f920: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
f930: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
f940: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
f950: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
f960: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
f970: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
f980: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
f990: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
f9a0: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
f9b0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
f9c0: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
f9d0: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
f9e0: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
f9f0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
fa00: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
fa10: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
fa20: 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
fa30: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
fa40: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
fa50: 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
fa60: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
fa70: 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
fa80: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fa90: 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
faa0: 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
fab0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
fac0: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
fad0: 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e   isDeferred;.#en
fae0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
faf0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
fb00: 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
fb10: 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
fb20: 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
fb30: 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
fb40: 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
fb50: 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
fb60: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
fb70: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
fb80: 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
fb90: 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
fba0: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
fbb0: 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
fbc0: 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
fbd0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
fbe0: 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
fbf0: 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d  reated.  The mem
fc00: 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69  ory cell specifi
fc10: 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
fc20: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
fc30: 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
fc40: 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
fc50: 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
fc60: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
fc70: 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
fc80: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
fc90: 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
fca0: 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
fcb0: 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
fcc0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
fcd0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
fce0: 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
fcf0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
fd00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
fd10: 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
fd20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
fd30: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
fd40: 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
fd50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
fd60: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
fd70: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
fd80: 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
fd90: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
fda0: 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20  arse->nTab;     
fdb0: 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
fdc0: 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
fdd0: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
fde0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20  pParse->nTab+1; 
fdf0: 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
fe00: 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
fe10: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  dex */.  int add
fe20: 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
fe30: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
fe40: 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
fe50: 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  p */.  int tnum;
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
fe80: 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
fe90: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
fec0: 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
fed0: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
fee0: 69 6e 74 20 69 73 55 6e 69 71 75 65 3b 20 20 20  int isUnique;   
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff00: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 75 6e 69  * True for a uni
ff10: 71 75 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  que index */..  
ff20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
ff30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
ff40: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
ff50: 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
ff60: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ge>=0 ){.    sql
ff70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ff80: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d   OP_MemLoad, mem
ff90: 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20  RootPage, 0);.  
ffa0: 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65    tnum = 0;.  }e
ffb0: 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
ffc0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
ffd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ffe0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  Op(v, OP_Clear, 
fff0: 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44  tnum, pIndex->iD
10000 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
10010 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10020 5f 49 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78  _Integer, pIndex
10030 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  ->iDb, 0);.  sql
10040 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10050 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
10060 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20  x, tnum,.       
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
10080 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79  ar*)&pIndex->key
10090 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
100a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
100b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
100c0 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20  ger, pTab->iDb, 
100d0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
100e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
100f0 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 54 61  nRead, iTab, pTa
10100 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69  b->tnum);.  sqli
10110 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10120 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
10130 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43  , iTab, pTab->nC
10140 6f 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ol);.  addr1 = s
10150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10160 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
10170 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ab, 0);.  sqlite
10180 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
10190 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61  y(v, pIndex, iTa
101a0 62 29 3b 0a 20 20 69 73 55 6e 69 71 75 65 20 3d  b);.  isUnique =
101b0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
101c0 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c  !=OE_None;.  sql
101d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
101e0 20 4f 50 5f 49 64 78 50 75 74 2c 20 69 49 64 78   OP_IdxPut, iIdx
101f0 2c 20 69 73 55 6e 69 71 75 65 29 3b 0a 20 20 69  , isUnique);.  i
10200 66 28 20 69 73 55 6e 69 71 75 65 20 29 7b 0a 20  f( isUnique ){. 
10210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10220 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69  angeP3(v, -1, "i
10230 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
10240 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
10250 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  P3_STATIC);.  }.
10260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10270 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
10280 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20  Tab, addr1+1);. 
10290 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
102a0 67 65 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73  geP2(v, addr1, s
102b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
102c0 74 41 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c  tAddr(v));.  sql
102d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
102e0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c   OP_Close, iTab,
102f0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
10300 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
10310 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d  ose, iIdx, 0);.}
10320 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
10330 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
10340 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
10350 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
10360 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
10370 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
10380 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10390 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
103a0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
103b0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
103c0 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
103d0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
103e0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
103f0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
10400 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
10410 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
10420 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
10430 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
10440 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
10450 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
10460 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
10470 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
10480 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
10490 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
104a0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
104b0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
104c0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
104d0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
104e0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
104f0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
10500 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
10510 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
10520 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
10530 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
10540 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
10550 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
10560 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
10570 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10580 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10590 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
105a0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
105b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
105c0 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
105d0 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
105e0 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
105f0 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
10600 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
10610 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
10620 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
10630 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
10640 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
10650 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
10660 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
10670 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54  *pTblName,  /* T
10680 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
10690 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
106a0 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
106b0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
106c0 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
106d0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
106e0 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
106f0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
10700 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
10710 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
10720 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
10730 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
10740 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
10750 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
10760 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
10770 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
10780 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
10790 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
107a0 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
107b0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
107c0 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
107d0 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62  pTab = 0; /* Tab
107e0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
107f0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
10800 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  dex = 0; /* The 
10810 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
10820 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
10830 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
10840 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
10850 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
10860 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
10870 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
10880 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
10890 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
108a0 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
108b0 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
108c0 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20   int isTemp;    
108d0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
108e0 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20  temporary index 
108f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10900 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
10910 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
10920 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10930 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
10940 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
10950 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
10960 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
10970 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
10980 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
10990 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  eate */..  if( p
109a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
109b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
109c0 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
109d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
109e0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
109f0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
10a00 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
10a10 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
10a20 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
10a30 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
10a40 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
10a50 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
10a60 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
10a70 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
10a80 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
10a90 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
10aa0 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
10ab0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
10ac0 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
10ad0 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
10ae0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
10af0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
10b00 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
10b10 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
10b20 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
10b30 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
10b40 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
10b50 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
10b60 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10b70 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ndex;..    /* If
10b80 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
10b90 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
10ba0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
10bb0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
10bc0 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
10bd0 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
10be0 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20  atabase to 1..  
10bf0 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20    */.    pTab = 
10c00 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
10c10 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
10c20 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
10c30 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
10c40 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
10c50 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29  & pTab->iDb==1 )
10c60 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b  {.      iDb = 1;
10c70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10c80 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
10c90 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
10ca0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
10cb0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
10cc0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
10cd0 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
10ce0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
10cf0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10d00 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
10d10 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
10d20 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
10d30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
10d40 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
10d50 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
10d60 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
10d70 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
10d80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10d90 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
10da0 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
10db0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10dc0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
10dd0 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
10de0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10df0 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62  ;.    iDb = pTab
10e00 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66  ->iDb;.  }..  if
10e10 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
10e20 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
10e30 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10e40 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
10e50 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
10e60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10e70 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
10e80 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
10e90 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
10ea0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
10eb0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10ec0 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
10ed0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
10ee0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10ef0 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
10f00 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
10f10 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
10f20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10f30 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20  .  }.  isTemp = 
10f40 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
10f50 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
10f60 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
10f70 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
10f80 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
10f90 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
10fa0 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
10fb0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
10fc0 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
10fd0 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
10fe0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
10ff0 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
11000 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
11010 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
11020 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11030 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
11040 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
11050 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
11060 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
11070 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
11080 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
11090 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
110a0 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
110b0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
110c0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
110d0 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
110e0 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
110f0 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
11100 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
11110 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
11120 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
11130 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
11140 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
11150 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
11160 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
11170 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
11180 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
11190 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
111a0 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
111b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
111c0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
111d0 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
111e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
111f0 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
11200 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11210 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11220 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
11230 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
11240 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
11250 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
11260 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11270 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11280 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
11290 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e  busy ){.      In
112a0 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
112b0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
112c0 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
112d0 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
112e0 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
112f0 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
11300 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
11310 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
11320 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
11330 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
11340 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
11350 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11360 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
11370 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
11380 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
11390 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  ex(db, zName, db
113a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
113b0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
113c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
113d0 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
113e0 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
113f0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
11400 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
11410 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11420 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
11430 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
11440 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
11450 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
11460 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11470 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11480 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
11490 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
114a0 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
114b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
114c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
114d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
114e0 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d  else if( pName==
114f0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
11500 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
11510 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
11520 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
11530 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
11540 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
11550 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
11560 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
11570 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e  ntf(zBuf,"_%d",n
11580 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
11590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
115a0 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
115b0 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
115c0 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  _", pTab->zName,
115d0 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
115e0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
115f0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
11600 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11610 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
11620 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
11630 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
11640 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
11650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
11660 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
11670 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11680 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
11690 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
116a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
116b0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
116c0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
116d0 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
116e0 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
116f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11700 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11710 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
11720 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
11730 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
11740 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
11750 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
11760 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
11770 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11780 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
11790 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
117a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
117b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
117c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
117d0 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
117e0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
117f0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
11800 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
11810 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
11820 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
11830 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
11840 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
11850 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
11860 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
11870 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
11880 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
11890 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
118a0 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
118b0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
118c0 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
118d0 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
118e0 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
118f0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
11900 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
11910 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
11920 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
11930 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
11940 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
11950 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
11960 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
11970 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
11980 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
11990 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
119a0 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
119b0 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74       (sizeof(int
119e0 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) + sizeof(CollS
119f0 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
11a00 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  pr );.  if( pInd
11a10 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
11a20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11a30 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
11a40 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
11a50 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11a60 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  l[pList->nExpr];
11a70 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
11a80 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
11a90 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
11aa0 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72  t->nExpr];.  str
11ab0 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
11ac0 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
11ad0 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
11ae0 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
11af0 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
11b00 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
11b10 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
11b20 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
11b30 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
11b40 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62  0;.  pIndex->iDb
11b50 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63   = iDb;..  /* Sc
11b60 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
11b70 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
11b80 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
11b90 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
11ba0 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
11bb0 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
11bc0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
11bd0 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
11be0 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
11bf0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
11c00 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
11c10 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
11c20 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  pr; i++){.    fo
11c30 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
11c40 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
11c50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
11c60 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
11c70 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
11c80 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
11c90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11ca0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
11cb0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
11cc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11cd0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
11ce0 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
11cf0 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
11d00 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
11d10 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
11d20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11d30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11d40 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
11d50 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
11d60 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
11d70 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
11d80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
11d90 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
11da0 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
11db0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
11dc0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
11dd0 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
11de0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
11df0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
11e00 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
11e10 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
11e20 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
11e30 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
11e40 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
11e50 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
11e60 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
11e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
11e80 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
11e90 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
11ea0 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
11eb0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11ec0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
11ee0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
11ef0 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
11f00 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  xpr;..  if( pTab
11f10 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
11f20 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
11f30 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
11f40 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
11f50 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
11f60 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
11f70 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
11f80 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
11f90 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
11fa0 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
11fb0 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
11fc0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
11fd0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
11fe0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
11ff0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
12000 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
12010 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
12020 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
12030 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
12040 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
12050 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
12060 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
12070 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
12080 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
12090 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
120a0 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
120b0 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
120c0 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
120d0 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
120e0 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
120f0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
12100 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
12110 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
12120 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
12130 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
12140 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
12150 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
12160 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
12170 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
12180 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
12190 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
121a0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
121b0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
121c0 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
121d0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
121e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
121f0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
12200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12210 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
12220 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
12230 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12240 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
12250 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
12260 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
12270 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
12280 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
12290 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
122a0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
122b0 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
122c0 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
122d0 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
122e0 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
122f0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
12300 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
12310 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
12320 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
12330 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12340 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
12350 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
12360 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
12370 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
12380 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
12390 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
123a0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
123b0 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
123c0 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
123d0 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
123e0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
123f0 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
12400 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
12410 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
12420 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
12430 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
12440 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
12450 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
12460 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
12470 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
12480 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
12490 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
124a0 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
124b0 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
124c0 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
124d0 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
124e0 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
124f0 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
12500 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
12510 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
12520 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
12530 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
12540 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
12550 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
12560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12570 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12590 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
125a0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
125b0 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
125c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
125d0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
125e0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
125f0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
12600 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
12610 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
12620 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
12630 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12640 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12650 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12660 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12670 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
12680 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
12690 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
126a0 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
126b0 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
126c0 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
126d0 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
126e0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
126f0 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
12700 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
12710 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
12720 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64  [pIndex->iDb].id
12730 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
12760 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a  strlen(pIndex->z
12770 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
12780 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
12790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
127a0 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
127b0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
127c0 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ailed */.      g
127d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
127e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
127f0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
12800 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
12810 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
12820 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
12830 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
12840 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
12850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12860 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
12870 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
12880 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
12890 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
128a0 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
128b0 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
128c0 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
128d0 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
128e0 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
128f0 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
12900 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
12910 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
12920 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
12930 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
12940 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
12950 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
12960 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
12970 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
12980 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
12990 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
129a0 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
129b0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
129c0 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
129d0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
129e0 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
129f0 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
12a00 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
12a10 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
12a20 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
12a30 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
12a40 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
12a50 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
12a60 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
12a70 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
12a80 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
12a90 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
12aa0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
12ab0 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
12ac0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
12ad0 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
12ae0 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
12af0 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
12b00 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
12b10 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
12b20 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
12b30 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
12b40 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
12b50 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
12b60 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56  busy==0 ){.    V
12b70 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
12b80 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
12b90 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
12ba0 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d  nMem++;..    v =
12bb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12bc0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
12bd0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
12be0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12bf0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
12c00 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
12c10 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
12c20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
12c30 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
12c40 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
12c50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12c60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
12c70 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
12c80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12c90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
12ca0 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
12cb0 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
12cc0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
12cd0 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
12ce0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
12cf0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
12d00 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
12d10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
12d20 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
12d30 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
12d40 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
12d50 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
12d60 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
12d70 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
12d80 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
12d90 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
12da0 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
12db0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
12dc0 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
12dd0 0a 20 20 20 20 20 20 20 20 41 64 64 72 28 70 45  .        Addr(pE
12de0 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e  nd->z) - Addr(pN
12df0 61 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20  ame->z) + 1,.   
12e00 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a       pName->z);.
12e10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
12e30 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
12e40 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
12e50 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
12e60 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
12e70 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
12e80 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
12e90 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
12ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
12eb0 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
12ec0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
12ed0 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
12ee0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
12ef0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
12f00 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
12f10 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
12f20 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
12f30 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20  %Q,#0,%Q);",.   
12f40 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
12f50 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
12f60 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
12f70 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
12f80 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
12f90 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
12fa0 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
12fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fc0 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
12fd0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
12fe0 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  ee(zStmt);..    
12ff0 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
13000 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
13010 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
13020 6d 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ma.    */.    if
13030 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
13040 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
13050 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
13060 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
13070 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
13080 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
13090 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
130a0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
130b0 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
130c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71  , 0,.         sq
130d0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61  lite3MPrintf("na
130e0 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
130f0 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
13100 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
13110 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
13120 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
13130 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
13140 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
13150 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
13160 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
13170 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
13180 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
13190 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
131a0 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
131b0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
131c0 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
131d0 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
131e0 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
131f0 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  T..  */.  if( db
13200 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
13210 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
13220 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
13230 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
13240 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
13250 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
13260 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
13270 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
13280 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
13290 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
132a0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
132b0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
132c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
132d0 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
132e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
132f0 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
13300 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
13310 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
13320 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
13330 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
13340 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
13350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13360 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
13370 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
13380 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
13390 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
133a0 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  }.    pIndex = 0
133b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
133c0 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
133d0 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
133e0 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
133f0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72  pIndex ){.    fr
13400 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
13410 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
13420 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
13430 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
13440 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c  cListDelete(pTbl
13450 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
13460 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
13470 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
13480 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13490 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
134a0 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
134b0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
134c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
134d0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
134e0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
134f0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
13500 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
13510 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
13520 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
13530 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
13540 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13550 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
13560 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
13570 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
13580 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
13590 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
135a0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
135b0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
135c0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
135d0 73 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  se) ) return;.  
135e0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
135f0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
13600 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
13610 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
13620 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
13630 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
13640 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13650 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
13660 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
13670 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  me, 0);.    pPar
13680 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
13690 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
136a0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
136b0 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
136c0 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
136d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
136e0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
136f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13700 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
13710 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
13720 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
13730 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
13740 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13750 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
13760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13770 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
13780 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
13790 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
137a0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
137b0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
137c0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
137d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
137e0 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d   db->aDb[pIndex-
137f0 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
13800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
13810 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
13820 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20  (pIndex->iDb);. 
13830 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13840 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13850 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
13860 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
13870 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13880 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
13890 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  }.    if( pIndex
138a0 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  ->iDb ) code = S
138b0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
138c0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
138d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
138e0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
138f0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
13900 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
13910 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13920 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13930 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
13940 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13950 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
13960 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
13970 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
13980 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
13990 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
139a0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
139b0 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65   int iDb = pInde
139c0 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69  x->iDb;.    sqli
139d0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
139e0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
139f0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
13a00 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
13a10 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
13a20 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
13a30 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
13a40 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
13a50 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
13a60 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
13a70 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
13a80 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
13a90 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
13aa0 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
13ab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13ac0 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p3(v, OP_DropInd
13ad0 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64  ex, iDb, 0, pInd
13ae0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
13af0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
13b00 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
13b10 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
13b20 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  e);.}../*.** App
13b30 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
13b40 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
13b50 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
13b60 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
13b70 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
13b80 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
13b90 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
13ba0 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
13bb0 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
13bc0 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
13bd0 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
13be0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
13bf0 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
13c00 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
13c10 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
13c20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
13c30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
13c40 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
13c50 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
13c60 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
13c70 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73  pList->nId>=pLis
13c80 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
13c90 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
13ca0 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73  tem *a;.    pLis
13cb0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73  t->nAlloc = pLis
13cc0 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b  t->nAlloc*2 + 5;
13cd0 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
13ce0 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
13cf0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73   pList->nAlloc*s
13d00 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
13d10 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  ]) );.    if( a=
13d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
13d30 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
13d40 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
13d50 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
13d60 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
13d70 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
13d80 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
13d90 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  d], 0, sizeof(pL
13da0 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70  ist->a[0]));.  p
13db0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
13dc0 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  Id].zName = sqli
13dd0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13de0 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73  (pToken);.  pLis
13df0 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75  t->nId++;.  retu
13e00 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
13e10 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
13e20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
13e30 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
13e40 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
13e50 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
13e60 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
13e70 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
13e80 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
13e90 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
13ea0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
13eb0 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
13ec0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
13ed0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
13ee0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
13ef0 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
13f00 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
13f10 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
13f20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
13f30 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
13f40 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
13f50 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
13f60 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
13f70 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
13f80 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
13f90 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
13fa0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
13fb0 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
13fc0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
13fd0 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
13fe0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
13ff0 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
14000 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
14010 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
14020 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
14030 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
14040 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
14050 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
14060 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
14070 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
14080 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
14090 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
140a0 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
140b0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
140c0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
140d0 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
140e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
140f0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
14100 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,0);.**.** T
14110 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
14120 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
14130 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
14140 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
14150 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
14160 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
14170 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14180 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
14190 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
141a0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
141b0 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
141c0 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
141d0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
141e0 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c  cListAppend(SrcL
141f0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
14200 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e  n *pTable, Token
14210 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *pDatabase){.  
14220 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14230 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
14240 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
14250 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
14260 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53  Malloc( sizeof(S
14270 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
14280 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14290 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
142a0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
142b0 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
142c0 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c  nSrc>=pList->nAl
142d0 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
142e0 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c  st *pNew;.    pL
142f0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32  ist->nAlloc *= 2
14300 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
14310 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
14320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14330 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
14340 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
14350 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
14360 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
14370 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
14380 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
14390 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
143a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
143b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
143c0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
143d0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
143e0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
143f0 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
14400 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
14410 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
14420 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
14430 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
14440 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
14450 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
14460 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
14470 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
14480 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
14490 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
144a0 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
144b0 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
144c0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
144d0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
144e0 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20  Token(pTable);. 
144f0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
14500 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
14510 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61  romToken(pDataba
14520 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
14530 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
14540 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
14550 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
14560 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
14570 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
14580 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
14590 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
145a0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
145b0 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
145c0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
145d0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
145e0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
145f0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
14600 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
14610 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20  .iCursor<0 ){.  
14620 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
14630 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
14640 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nTab++;.    }.
14650 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
14660 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
14670 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72   last identifier
14680 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64   on the given id
14690 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a  entifier list..*
146a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
146b0 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72  cListAddAlias(Sr
146c0 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
146d0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
146e0 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
146f0 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20  st->nSrc>0 ){.  
14700 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
14710 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73  ->nSrc-1].zAlias
14720 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
14730 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
14740 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
14750 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
14760 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
14770 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69  dListDelete(IdLi
14780 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
14790 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
147a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
147b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
147c0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
147d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
147e0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
147f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
14800 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
14810 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
14820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14830 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
14840 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
14850 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
14860 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
14870 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
14880 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
14890 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
148a0 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
148b0 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
148c0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
148d0 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
148e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
148f0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
14900 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
14910 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
14920 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
14930 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
14940 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
14950 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
14960 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
14970 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
14980 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
14990 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
149a0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72  SrcListDelete(Sr
149b0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
149c0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
149d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
149e0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
149f0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14a00 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
14a10 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
14a20 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
14a30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
14a40 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44  teFree(pItem->zD
14a50 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
14a60 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
14a70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
14a80 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41  teFree(pItem->zA
14a90 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
14aa0 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49  Item->pTab && pI
14ab0 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61  tem->pTab->isTra
14ac0 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
14ad0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
14ae0 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61  le(0, pItem->pTa
14af0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
14b00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14b10 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
14b20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14b30 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
14b40 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
14b50 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
14b60 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
14b70 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
14b80 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
14b90 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
14ba0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14bb0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
14bc0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
14bd0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
14be0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14bf0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
14c00 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14c10 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14c20 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14c30 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14c40 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14c50 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14c60 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14c70 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
14c80 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14c90 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14ca0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
14cb0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
14cc0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
14cd0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14ce0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
14cf0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14d00 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
14d10 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
14d20 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14d30 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
14d40 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14d50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
14d60 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
14d70 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  SIVE)+1);.    }.
14d80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14d90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
14da0 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
14db0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
14dc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
14dd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
14de0 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
14df0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14e00 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14e10 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
14e20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14e30 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14e40 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14e50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14e60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14e70 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14e80 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14e90 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14ea0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14eb0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14ec0 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
14ed0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14ee0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14ef0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14f00 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
14f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f20 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
14f30 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
14f40 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
14f50 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
14f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
14f70 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
14f80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
14f90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
14fa0 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
14fb0 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
14fc0 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
14fd0 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
14fe0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
14ff0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15000 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
15010 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
15020 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
15030 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15040 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
15050 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
15060 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
15070 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
15080 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15090 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
150a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
150b0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
150c0 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
150d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
150e0 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
150f0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
15100 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
15110 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
15120 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
15130 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
15140 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
15150 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
15160 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
15170 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  tic int sqlite3O
15180 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
15190 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
151a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
151b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
151c0 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
151d0 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
151e0 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
151f0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
15200 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
15210 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
15220 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
15230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15250 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15260 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
15270 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
15280 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
15290 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
152a0 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
152b0 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
152c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
152d0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
152e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
152f0 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
15300 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
15310 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
15320 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
15330 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
15340 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
15350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15360 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15370 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15380 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
15390 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
153a0 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
153b0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
153c0 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
153d0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
153e0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
153f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
15400 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
15410 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
15420 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
15430 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
15440 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
15450 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
15460 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
15470 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
15480 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
15490 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
154a0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
154b0 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
154c0 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
154d0 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
154e0 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
154f0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
15500 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
15510 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
15520 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
15530 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
15540 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
15550 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
15560 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
15570 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
15580 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
15590 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
155a0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
155b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
155c0 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
155d0 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
155e0 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
155f0 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
15600 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
15610 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
15620 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
15630 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
15640 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
15650 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
15660 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
15670 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
15680 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
15690 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
156a0 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
156b0 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
156c0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
156d0 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
156e0 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
156f0 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
15700 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
15710 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
15720 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
15730 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
15740 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
15750 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
15760 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
15770 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
15780 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
15790 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
157a0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
157b0 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
157c0 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
157d0 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
157e0 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
157f0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
15800 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
15810 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
15820 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
15830 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
15840 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
15850 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
15860 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
15870 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
15880 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
15890 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
158a0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
158b0 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
158c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
158d0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
158e0 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
158f0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15900 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
15910 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
15920 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
15930 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
15940 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
15950 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15960 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
15970 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
15980 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15990 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
159a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
159b0 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
159c0 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
159d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
159e0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
159f0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
15a00 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
15a10 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
15a20 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20  ert( iDb<32 );. 
15a30 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
15a40 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
15a50 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
15a60 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
15a70 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15a80 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
15a90 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
15aa0 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
15ab0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
15ac0 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
15ad0 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
15ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
15af0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
15b00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
15b10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15b20 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
15b30 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
15b40 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
15b50 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
15b60 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
15b70 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15b80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15b90 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
15ba0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
15bb0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
15bc0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
15bd0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
15be0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
15bf0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
15c00 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
15c10 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
15c20 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
15c30 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
15c40 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
15c50 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
15c60 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
15c70 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
15c80 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
15c90 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
15ca0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
15cb0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
15cc0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
15cd0 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
15ce0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
15cf0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
15d00 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
15d10 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
15d20 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
15d30 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
15d40 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
15d50 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
15d60 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
15d70 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
15d80 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
15d90 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
15da0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
15db0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
15dc0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  set..**.** Only 
15dd0 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64  database iDb and
15de0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15df0 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
15e00 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c  able by this cal
15e10 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c  l..** If iDb==0,
15e20 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61   then the main a
15e30 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  nd temp database
15e40 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  s are made writa
15e50 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62  ble.   If.** iDb
15e60 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  ==1 then only th
15e70 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
15e80 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
15e90 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e  .  If iDb>1 then
15ea0 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
15eb0 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  d auxiliary data
15ec0 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d  base and the tem
15ed0 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
15ee0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ade writable..*/
15ef0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
15f00 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
15f10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15f20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
15f30 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
15f40 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
15f50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15f60 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
15f70 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  urn;.  sqlite3Co
15f80 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
15f90 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
15fa0 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
15fb0 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66   |= 1<<iDb;.  if
15fc0 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26  ( setStatement &
15fd0 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
15fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
15ff0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16000 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62  P_Statement, iDb
16010 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
16020 69 44 62 21 3d 31 20 26 26 20 70 50 61 72 73 65  iDb!=1 && pParse
16030 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
16040 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
16050 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
16060 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
16070 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
16080 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65    }.}../* .** Re
16090 74 75 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65  turn the transie
160a0 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
160b0 20 6f 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72   object used for
160c0 20 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72   encoding conver
160d0 73 69 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20  sions.** during 
160e0 53 51 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e  SQL compilation.
160f0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
16100 65 20 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61  e *sqlite3GetTra
16110 6e 73 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69  nsientValue(sqli
16120 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
16130 21 64 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20  !db->pValue ){. 
16140 20 20 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20     db->pValue = 
16150 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
16160 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16170 64 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a 0a 2f  db->pValue;.}../
16180 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
16190 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
161a0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
161b0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
161c0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
161d0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
161e0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
161f0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
16200 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
16210 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
16220 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c  llationMatch(Col
16230 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64  lSeq *pColl, Ind
16240 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
16250 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  nt n = pIndex->k
16260 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20  eyInfo.nField;. 
16270 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20   CollSeq **pp = 
16280 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
16290 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  aColl;.  while( 
162a0 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  n-- ){.    if( *
162b0 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75  pp==pColl ) retu
162c0 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a  rn 1;.    pp++;.
162d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
162e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
162f0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
16300 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
16310 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
16320 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
16330 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
16340 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
16350 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
16360 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
16370 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
16380 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65 69 6e  EINDEX.void rein
16390 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
163a0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
163b0 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  Tab, CollSeq *pC
163c0 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
163d0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
163e0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
163f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16400 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
16410 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
16420 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
16430 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
16440 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ){.    if( pColl
16450 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
16460 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64  Match(pColl,pInd
16470 65 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ex) ){.      sql
16480 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16490 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
164a0 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  0, pTab->iDb);. 
164b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
164c0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
164d0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
164e0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
164f0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
16500 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
16510 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
16520 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
16530 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
16540 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
16550 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
16560 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
16570 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
16580 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
16590 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
165a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
165b0 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72 65  _REINDEX.void re
165c0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
165d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
165e0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
165f0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16610 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
16620 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16640 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
16650 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
16660 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16670 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
16680 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16690 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
166a0 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
166c0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
166d0 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
166e0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
16710 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
16720 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
16730 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
16740 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
16750 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62  ++){.    if( pDb
16760 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
16770 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69        for(k=sqli
16780 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
16790 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
167a0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
167b0 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
167c0 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
167d0 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
167e0 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
167f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
16800 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
16810 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16820 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
16830 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
16840 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
16850 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
16880 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
16890 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
168a0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
168b0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
168c0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
168d0 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
168e0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
168f0 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
16900 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
16910 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
16920 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
16930 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
16940 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
16950 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
16960 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
16970 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
16980 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
16990 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
169a0 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
169b0 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
169c0 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
169d0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
169e0 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
169f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
16a00 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
16a10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16a20 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
16a30 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
16a40 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
16a50 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
16a60 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
16a70 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
16a80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
16a90 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
16aa0 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
16ab0 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
16ac0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ae0 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
16af0 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
16b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
16b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16b20 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
16b30 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
16b40 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
16b50 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
16b60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16b70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
16b80 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
16b90 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
16ba0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
16bb0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
16be0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
16bf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16c00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
16c10 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16c20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16c30 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
16c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16c50 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
16c60 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
16c70 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
16c80 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
16c90 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
16ca0 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
16cb0 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
16cc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16cd0 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
16ce0 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
16cf0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  z==0 ){.    pCol
16d00 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
16d10 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65  ollSeq(db, db->e
16d20 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  nc, pName1->z, p
16d30 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Name1->n, 0);.  
16d40 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
16d50 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
16d60 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 70 43  bases(pParse, pC
16d70 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
16d80 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
16d90 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
16da0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
16db0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
16dc0 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
16dd0 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
16de0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
16df0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f  NameFromToken(pO
16e00 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d  bjName);.  zDb =
16e10 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16e20 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
16e30 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
16e40 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
16e50 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
16e60 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
16e70 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
16e80 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
16e90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16ea0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
16eb0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
16ec0 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
16ed0 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20  eFree(z);.  if( 
16ee0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
16ef0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
16f00 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
16f10 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
16f20 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16f30 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16f40 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
16f50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
16f60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16f70 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
16f80 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
16f90 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
16fa0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
16fb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16fc0 41 4c 54 45 52 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  ALTERTABLE./*.**
16fd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16fe0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
16ff0 22 41 4c 54 45 52 20 54 41 42 4c 45 20 78 78 78  "ALTER TABLE xxx
17000 20 52 45 4e 41 4d 45 20 54 4f 20 79 79 79 22 20   RENAME TO yyy" 
17010 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  .** command. .*/
17020 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74  .void sqlite3Alt
17030 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 0a 20  erRenameTable(. 
17040 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
17060 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 2a 2f  rser context. */
17070 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
17080 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17090 54 68 65 20 74 61 62 6c 65 20 74 6f 20 72 65 6e  The table to ren
170a0 61 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ame. */.  Token 
170b0 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *pName          
170c0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
170d0 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 29 7b  able name. */.){
170e0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17100 44 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  Database that co
17110 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
17120 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62  /* Name of datab
17150 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 54 61 62  ase iDb */.  Tab
17160 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
17170 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
17180 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20 2a 2f  being renamed */
17190 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
171a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
171b0 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20  NULL-terminated 
171c0 76 65 72 73 69 6f 6e 20 6f 66 20 70 4e 61 6d 65  version of pName
171d0 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 7a 57 68   */ .  char *zWh
171e0 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ere = 0;        
171f0 20 2f 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65   /* Where clause
17200 20 6f 66 20 73 63 68 65 6d 61 20 65 6c 65 6d 65   of schema eleme
17210 6e 74 73 20 74 6f 20 72 65 70 61 72 73 65 20 2a  nts to reparse *
17220 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
17230 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
17240 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
17250 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
17260 76 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  v;.#ifndef SQLIT
17270 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
17280 20 63 68 61 72 20 2a 7a 54 65 6d 70 54 72 69 67   char *zTempTrig
17290 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
172a0 65 72 65 20 63 6c 61 75 73 65 20 74 6f 20 6c 6f  ere clause to lo
172b0 63 61 74 65 20 74 65 6d 70 20 74 72 69 67 67 65  cate temp trigge
172c0 72 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 0a  rs */.#endif.  .
172d0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
172e0 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 70 54  nSrc==1 );..  pT
172f0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
17300 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
17310 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  pSrc->a[0].zName
17320 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 44 61  , pSrc->a[0].zDa
17330 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 21  tabase);.  if( !
17340 70 54 61 62 20 29 20 72 65 74 75 72 6e 3b 0a 20  pTab ) return;. 
17350 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
17360 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
17370 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  b[iDb].zName;.. 
17380 20 2f 2a 20 47 65 74 20 61 20 4e 55 4c 4c 20 74   /* Get a NULL t
17390 65 72 6d 69 6e 61 74 65 64 20 76 65 72 73 69 6f  erminated versio
173a0 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
173b0 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 4e  le name. */.  zN
173c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
173d0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
173e0 29 3b 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  );.  if( !zName 
173f0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
17400 43 68 65 63 6b 20 74 68 61 74 20 61 20 74 61 62  Check that a tab
17410 6c 65 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65  le or index name
17420 64 20 27 7a 4e 61 6d 65 27 20 64 6f 65 73 20 6e  d 'zName' does n
17430 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
17440 0a 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  .  ** in databas
17450 65 20 69 44 62 2e 20 49 66 20 73 6f 2c 20 74 68  e iDb. If so, th
17460 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  is is an error..
17470 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
17480 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
17490 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 20 73  zName, zDb) || s
174a0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
174b0 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  db, zName, zDb) 
174c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
174d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
174e0 20 20 20 20 20 20 20 20 22 74 68 65 72 65 20 69          "there i
174f0 73 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  s already anothe
17500 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  r table or index
17510 20 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65 3a   with this name:
17520 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
17530 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
17540 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
17550 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
17560 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
17570 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 6e 76  IZATION.  /* Inv
17580 6f 6b 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a  oke the authoriz
17590 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20  ation callback. 
175a0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
175b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
175c0 2c 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  , SQLITE_ALTER_T
175d0 41 42 4c 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d  ABLE, zDb, pTab-
175e0 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20  >zName, 0) ){.  
175f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
17600 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
17610 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17620 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
17630 63 74 69 6f 6e 20 61 6e 64 20 63 6f 64 65 20 74  ction and code t
17640 68 65 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  he VerifyCookie 
17650 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
17660 2e 20 0a 20 20 2a 2a 20 54 68 65 6e 20 6d 6f 64  . .  ** Then mod
17670 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
17680 6f 6f 6b 69 65 20 28 73 69 6e 63 65 20 74 68 65  ookie (since the
17690 20 41 4c 54 45 52 20 54 41 42 4c 45 20 6d 6f 64   ALTER TABLE mod
176a0 69 66 69 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  ifies the.  ** s
176b0 63 68 65 6d 61 29 2e 0a 20 20 2a 2f 0a 20 20 76  chema)..  */.  v
176c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
176d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
176e0 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   v==0 ){.    sql
176f0 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
17700 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
17710 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
17720 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
17730 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
17740 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
17750 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
17760 0a 0a 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68  ..  /* Modify th
17770 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
17780 74 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65  table to use the
17790 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e   new table name.
177a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
177b0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
177c0 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
177d0 51 2e 25 73 20 53 45 54 20 22 0a 23 69 66 64 65  Q.%s SET ".#ifde
177e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
177f0 49 47 47 45 52 0a 20 20 20 20 20 20 20 20 20 20  IGGER.          
17800 22 73 71 6c 20 3d 20 73 71 6c 69 74 65 5f 61 6c  "sql = sqlite_al
17810 74 65 72 5f 74 61 62 6c 65 28 73 71 6c 2c 20 25  ter_table(sql, %
17820 51 29 2c 20 22 0a 23 65 6c 73 65 0a 20 20 20 20  Q), ".#else.    
17830 20 20 20 20 20 20 22 73 71 6c 20 3d 20 43 41 53        "sql = CAS
17840 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  E ".            
17850 22 57 48 45 4e 20 74 79 70 65 20 3d 20 27 74 72  "WHEN type = 'tr
17860 69 67 67 65 72 27 20 54 48 45 4e 20 73 71 6c 69  igger' THEN sqli
17870 74 65 5f 61 6c 74 65 72 5f 74 72 69 67 67 65 72  te_alter_trigger
17880 28 73 71 6c 2c 20 25 51 29 22 0a 20 20 20 20 20  (sql, %Q)".     
17890 20 20 20 20 20 20 20 22 45 4c 53 45 20 73 71 6c         "ELSE sql
178a0 69 74 65 5f 61 6c 74 65 72 5f 74 61 62 6c 65 28  ite_alter_table(
178b0 73 71 6c 2c 20 25 51 29 20 45 4e 44 2c 20 22 0a  sql, %Q) END, ".
178c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
178d0 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 2c   "tbl_name = %Q,
178e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 6e 61   ".          "na
178f0 6d 65 20 3d 20 43 41 53 45 20 22 0a 20 20 20 20  me = CASE ".    
17900 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 74 79          "WHEN ty
17910 70 65 3d 27 74 61 62 6c 65 27 20 54 48 45 4e 20  pe='table' THEN 
17920 25 51 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  %Q ".           
17930 20 22 57 48 45 4e 20 6e 61 6d 65 20 4c 49 4b 45   "WHEN name LIKE
17940 20 27 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   'sqlite_autoind
17950 65 78 25 25 27 20 41 4e 44 20 74 79 70 65 3d 27  ex%%' AND type='
17960 69 6e 64 65 78 27 20 54 48 45 4e 20 22 0a 20 20  index' THEN ".  
17970 20 20 20 20 20 20 20 20 20 20 20 20 22 27 73 71              "'sq
17980 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 27  lite_autoindex_'
17990 20 7c 7c 20 25 51 20 7c 7c 20 73 75 62 73 74 72   || %Q || substr
179a0 28 6e 61 6d 65 2c 20 25 64 2b 31 38 2c 31 30 29  (name, %d+18,10)
179b0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
179c0 45 4c 53 45 20 6e 61 6d 65 20 45 4e 44 20 22 0a  ELSE name END ".
179d0 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
179e0 5f 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70  _name=%Q AND typ
179f0 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27  e IN ('table', '
17a00 69 6e 64 65 78 27 2c 20 27 74 72 69 67 67 65 72  index', 'trigger
17a10 27 29 3b 22 2c 20 0a 20 20 20 20 20 20 64 62 2d  ');", .      db-
17a20 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
17a30 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
17a40 62 29 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  b), zName, zName
17a50 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  , zName, zName, 
17a60 0a 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73 74  .      zName, st
17a70 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  rlen(pTab->zName
17a80 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  ), pTab->zName. 
17a90 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
17aa0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
17ab0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
17ac0 72 65 20 54 45 4d 50 20 74 72 69 67 67 65 72 73  re TEMP triggers
17ad0 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2c 20   on this table, 
17ae0 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
17af0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 0a 20 20  e_temp_master.  
17b00 2a 2a 20 74 61 62 6c 65 2e 20 44 6f 6e 27 74 20  ** table. Don't 
17b10 64 6f 20 74 68 69 73 20 69 66 20 74 68 65 20 74  do this if the t
17b20 61 62 6c 65 20 62 65 69 6e 67 20 41 4c 54 45 52  able being ALTER
17b30 65 64 20 69 73 20 69 74 73 65 6c 66 20 6c 6f 63  ed is itself loc
17b40 61 74 65 64 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ated in.  ** the
17b50 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 0a   temp database..
17b60 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62 21 3d    */.  if( iDb!=
17b70 31 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  1 ){.    Trigger
17b80 20 2a 70 54 72 69 67 3b 0a 20 20 20 20 63 68 61   *pTrig;.    cha
17b90 72 20 2a 74 6d 70 20 3d 20 30 3b 0a 20 20 20 20  r *tmp = 0;.    
17ba0 66 6f 72 28 20 70 54 72 69 67 3d 70 54 61 62 2d  for( pTrig=pTab-
17bb0 3e 70 54 72 69 67 67 65 72 3b 20 70 54 72 69 67  >pTrigger; pTrig
17bc0 3b 20 70 54 72 69 67 3d 70 54 72 69 67 2d 3e 70  ; pTrig=pTrig->p
17bd0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 69 66  Next ){.      if
17be0 28 20 70 54 72 69 67 2d 3e 69 44 62 3d 3d 31 20  ( pTrig->iDb==1 
17bf0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
17c00 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a 20 20 20  zTempTrig ){.   
17c10 20 20 20 20 20 20 20 7a 54 65 6d 70 54 72 69 67         zTempTrig
17c20 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
17c30 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
17c40 28 22 74 79 70 65 20 3d 20 27 74 72 69 67 67 65  ("type = 'trigge
17c50 72 27 20 41 4e 44 20 6e 61 6d 65 20 49 4e 28 25  r' AND name IN(%
17c60 51 22 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65 29  Q", pTrig->name)
17c70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17c80 0a 20 20 20 20 20 20 20 20 20 20 74 6d 70 20 3d  .          tmp =
17c90 20 7a 54 65 6d 70 54 72 69 67 3b 0a 20 20 20 20   zTempTrig;.    
17ca0 20 20 20 20 20 20 7a 54 65 6d 70 54 72 69 67 20        zTempTrig 
17cb0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
17cc0 28 22 25 73 2c 20 25 51 22 2c 20 7a 54 65 6d 70  ("%s, %Q", zTemp
17cd0 54 72 69 67 2c 20 70 54 72 69 67 2d 3e 6e 61 6d  Trig, pTrig->nam
17ce0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
17cf0 6c 69 74 65 46 72 65 65 28 74 6d 70 29 3b 0a 20  liteFree(tmp);. 
17d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17d10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
17d20 54 65 6d 70 54 72 69 67 20 29 7b 0a 20 20 20 20  TempTrig ){.    
17d30 20 20 74 6d 70 20 3d 20 7a 54 65 6d 70 54 72 69    tmp = zTempTri
17d40 67 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 54 72  g;.      zTempTr
17d50 69 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ig = sqlite3MPri
17d60 6e 74 66 28 22 25 73 29 22 2c 20 7a 54 65 6d 70  ntf("%s)", zTemp
17d70 54 72 69 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  Trig);.      sql
17d80 69 74 65 46 72 65 65 28 74 6d 70 29 3b 0a 20 20  iteFree(tmp);.  
17d90 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
17da0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
17db0 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54            "UPDAT
17dc0 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  E sqlite_temp_ma
17dd0 73 74 65 72 20 53 45 54 20 22 0a 20 20 20 20 20  ster SET ".     
17de0 20 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20           "sql = 
17df0 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74 72 69  sqlite_alter_tri
17e00 67 67 65 72 28 73 71 6c 2c 20 25 51 29 2c 20 22  gger(sql, %Q), "
17e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
17e20 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 20 22 0a  tbl_name = %Q ".
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57                "W
17e40 48 45 52 45 20 25 73 3b 22 2c 20 7a 4e 61 6d 65  HERE %s;", zName
17e50 2c 20 7a 4e 61 6d 65 2c 20 7a 54 65 6d 70 54 72  , zName, zTempTr
17e60 69 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ig);.    }.  }.#
17e70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
17e80 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
17e90 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
17ea0 63 68 65 6d 61 20 74 68 61 74 20 72 65 66 65 72  chema that refer
17eb0 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 0a  ed to the table.
17ec0 20 20 2a 2a 20 72 65 6e 61 6d 65 64 20 61 6e 64    ** renamed and
17ed0 20 6c 6f 61 64 20 74 68 65 20 6e 65 77 20 76 65   load the new ve
17ee0 72 73 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20  rsions from the 
17ef0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
17f00 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
17f10 72 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  r==0 ){.#ifndef 
17f20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
17f30 47 45 52 0a 20 20 20 20 54 72 69 67 67 65 72 20  GER.    Trigger 
17f40 2a 70 54 72 69 67 3b 0a 20 20 20 20 66 6f 72 28  *pTrig;.    for(
17f50 20 70 54 72 69 67 3d 70 54 61 62 2d 3e 70 54 72   pTrig=pTab->pTr
17f60 69 67 67 65 72 3b 20 70 54 72 69 67 3b 20 70 54  igger; pTrig; pT
17f70 72 69 67 3d 70 54 72 69 67 2d 3e 70 4e 65 78 74  rig=pTrig->pNext
17f80 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17f90 28 20 70 54 72 69 67 2d 3e 69 44 62 3d 3d 69 44  ( pTrig->iDb==iD
17fa0 62 20 7c 7c 20 70 54 72 69 67 2d 3e 69 44 62 3d  b || pTrig->iDb=
17fb0 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
17fc0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
17fd0 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20 70 54  _DropTrigger, pT
17fe0 72 69 67 2d 3e 69 44 62 2c 20 30 2c 20 70 54 72  rig->iDb, 0, pTr
17ff0 69 67 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  ig->name, 0);.  
18000 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73    }.#endif.    s
18010 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18020 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
18030 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  Db, 0, pTab->zNa
18040 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7a 57 68 65  me, 0);.    zWhe
18050 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  re = sqlite3MPri
18060 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 25 51  ntf("tbl_name=%Q
18070 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  ", zName);.    s
18080 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18090 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
180a0 20 69 44 62 2c 20 30 2c 20 7a 57 68 65 72 65 2c   iDb, 0, zWhere,
180b0 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 23 69   P3_DYNAMIC);.#i
180c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
180d0 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 69 66  T_TRIGGER.    if
180e0 28 20 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a 20  ( zTempTrig ){. 
180f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18100 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(v, OP_ParseS
18110 63 68 65 6d 61 2c 20 31 2c 20 30 2c 20 7a 54 65  chema, 1, 0, zTe
18120 6d 70 54 72 69 67 2c 20 50 33 5f 44 59 4e 41 4d  mpTrig, P3_DYNAM
18130 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  IC);.    }.  }el
18140 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  se{.    sqliteFr
18150 65 65 28 7a 54 65 6d 70 54 72 69 67 29 3b 0a 23  ee(zTempTrig);.#
18160 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 73 71 6c  endif.  }..  sql
18170 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
18180 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.