/ Hex Artifact Content
Login

Artifact 467e940702206e950d810e765586a787ec06dd5b:


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 31 20 32 30 30 34 2f 31 31 2f 31 39  1.281 2004/11/19
02f0: 20 30 35 3a 31 34 3a 35 35 20 64 61 6e 69 65 6c   05:14:55 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 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  }..    /* Drop a
e5d0: 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
e5e0: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
e5f0: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
e600: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
e610: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
e620: 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
e630: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
e640: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
e650: 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
e660: 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
e670: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
e680: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
e690: 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
e6a0: 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
e6b0: 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
e6c0: 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
e6d0: 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
e6e0: 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
e6f0: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
e700: 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
e710: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
e720: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
e730: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
e740: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
e750: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
e760: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44  rse, .        "D
e770: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
e780: 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
e790: 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
e7a0: 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20  igger'",.       
e7b0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
e7c0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
e7d0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e7e0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
e7f0: 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61  .      destroyTa
e800: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
e810: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  );.    }..#ifnde
e820: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e830: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
e840: 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
e850: 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
e860: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
e870: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
e880: 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
e890: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
e8a0: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  d */.    if( pTa
e8b0: 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  b->autoInc ){.  
e8c0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
e8d0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
e8e0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
e8f0: 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
e900: 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
e910: 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
e920: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
e930: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
e940: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
e950: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
e960: 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
e970: 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
e980: 61 6c 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2f  al schema.    */
e990: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e9a0: 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op3(v, OP_DropTa
e9b0: 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61  ble, iDb, 0, pTa
e9c0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
e9d0: 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  }.  sqliteViewRe
e9e0: 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
e9f0: 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
ea00: 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
ea10: 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
ea20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
ea30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ea40: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
ea50: 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e  w foreign key on
ea60: 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75   the table.** cu
ea70: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
ea80: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72  nstruction.  pFr
ea90: 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73  omCol determines
eaa0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a   which columns.*
eab0: 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
eac0: 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20   table point to 
ead0: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e  the foreign key.
eae0: 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30    If pFromCol==0
eaf0: 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74   then.** connect
eb00: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
eb10: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65  last column inse
eb20: 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68  rted.  pTo is th
eb30: 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  e name of.** the
eb40: 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
eb50: 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  to.  pToCol is a
eb60: 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
eb70: 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  in the other.** 
eb80: 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74  pTo table that t
eb90: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70  he foreign key p
eba0: 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73  oints to.  flags
ebb0: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
ebc0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
ebd0: 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ut the conflict 
ebe0: 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
ebf0: 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a  ithms specified.
ec00: 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c  ** in the ON DEL
ec10: 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61  ETE, ON UPDATE a
ec20: 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61  nd ON INSERT cla
ec30: 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  uses..**.** An F
ec40: 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73  Key structure is
ec50: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
ec60: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
ec70: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64  currently.** und
ec80: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
ec90: 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  in the pParse->p
eca0: 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20  NewTable field. 
ecb0: 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a   The new FKey.**
ecc0: 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69   is not linked i
ecd0: 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74  nto db->aFKey at
ece0: 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68   this point - th
ecf0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  at does not happ
ed00: 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69  en.** until sqli
ed10: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a  te3EndTable()..*
ed20: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
ed30: 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
ed40: 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
ed50: 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
ed60: 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
ed70: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
ed80: 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
ed90: 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
eda0: 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
edb0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
edc0: 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
edd0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
ede0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
edf0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ee00: 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
ee10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
ee20: 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
ee30: 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
ee40: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
ee50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
ee60: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
ee70: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
ee80: 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
ee90: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
eea0: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
eeb0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
eec0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
eed0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
eee0: 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23  orithms. */.){.#
eef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef00: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
ef10: 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
ef20: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
ef30: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ef40: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
ef50: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
ef60: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
ef70: 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
ef80: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
ef90: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
efa0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
efb0: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
efc0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
efd0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
efe0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f   if( iCol<0 ) go
eff0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
f000: 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
f010: 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
f020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f030: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f040: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
f050: 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
f060: 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
f070: 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
f080: 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
f090: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
f0a0: 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
f0b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
f0c0: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
f0d0: 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
f0e0: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
f0f0: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
f100: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
f110: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f120: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
f130: 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
f140: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
f150: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
f160: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
f170: 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
f180: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
f190: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
f1a0: 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
f1b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
f1c0: 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
f1d0: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
f1e0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
f1f0: 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f  ey) + nCol*sizeo
f200: 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
f210: 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
f220: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
f230: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f240: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
f250: 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
f260: 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c  += strlen(pToCol
f270: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
f280: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
f290: 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c  FKey = sqliteMal
f2a0: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
f2b0: 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67  if( pFKey==0 ) g
f2c0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46  oto fk_end;.  pF
f2d0: 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
f2e0: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
f2f0: 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
f300: 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
f310: 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  ey[1];.  pFKey->
f320: 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73  aCol = (struct s
f330: 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b  ColMap*)z;.  z +
f340: 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  = sizeof(struct 
f350: 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20  sColMap)*nCol;. 
f360: 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
f370: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
f380: 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
f390: 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
f3a0: 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
f3b0: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
f3c0: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e   = 0;.  pFKey->n
f3d0: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
f3e0: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
f3f0: 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
f400: 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
f410: 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
f420: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f430: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
f440: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
f450: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
f460: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
f470: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f480: 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
f490: 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
f4a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
f4b0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
f4c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
f4d0: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
f4e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f500: 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
f510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f520: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f530: 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
f540: 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
f550: 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
f560: 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
f570: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
f580: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
f590: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
f5a0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
f5b0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
f5c0: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
f5d0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
f5e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
f5f0: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
f600: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
f610: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
f620: 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
f630: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
f640: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
f650: 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
f660: 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
f670: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
f680: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
f690: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64   = 0;.  pFKey->d
f6a0: 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67  eleteConf = flag
f6b0: 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  s & 0xff;.  pFKe
f6c0: 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20  y->updateConf = 
f6d0: 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
f6e0: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  0xff;.  pFKey->i
f6f0: 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61  nsertConf = (fla
f700: 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66  gs >> 16 ) & 0xf
f710: 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  f;..  /* Link th
f720: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
f730: 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
f740: 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
f750: 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
f760: 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
f770: 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
f780: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
f790: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
f7a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f7b0: 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
f7c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
f7d0: 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c  tDelete(pFromCol
f7e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
f7f0: 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f  ListDelete(pToCo
f800: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
f810: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f820: 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
f830: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
f840: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
f850: 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
f860: 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
f870: 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
f880: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
f890: 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
f8a0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
f8b0: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
f8c0: 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
f8d0: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
f8e0: 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
f8f0: 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
f900: 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
f910: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
f920: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
f930: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
f940: 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
f950: 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
f960: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
f970: 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
f980: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
f990: 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
f9a0: 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
f9b0: 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
f9c0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
f9d0: 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
f9e0: 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
f9f0: 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
fa00: 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
fa10: 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65  rred = isDeferre
fa20: 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
fa30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
fa40: 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
fa50: 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
fa60: 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
fa70: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
fa80: 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
fa90: 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
faa0: 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
fab0: 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
fac0: 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
fad0: 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
fae0: 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
faf0: 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
fb00: 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
fb10: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
fb20: 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
fb30: 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
fb40: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73  he memory cell s
fb50: 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
fb60: 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
fb70: 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
fb80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
fb90: 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
fba0: 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
fbb0: 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
fbc0: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
fbd0: 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
fbe0: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
fbf0: 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
fc00: 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
fc10: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
fc20: 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
fc30: 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
fc40: 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
fc50: 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
fc60: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
fc70: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
fc80: 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
fc90: 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
fca0: 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
fcb0: 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
fcc0: 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
fcd0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
fce0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
fcf0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ;       /* Btree
fd00: 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
fd10: 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
fd20: 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
fd30: 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab+1;     /* Btr
fd40: 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
fd50: 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
fd60: 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd80: 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
fd90: 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
fda0: 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
fdc0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
fdd0: 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
fe00: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
fe10: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fe20: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e 69 71   */.  int isUniq
fe30: 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
fe40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
fe50: 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20   a unique index 
fe60: 2a 2f 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  */..  v = sqlite
fe70: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
fe80: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
fe90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
fea0: 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
feb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fec0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
fed0: 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20  d, memRootPage, 
fee0: 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30  0);.    tnum = 0
fef0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
ff00: 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
ff10: 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
ff20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
ff30: 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e 64  lear, tnum, pInd
ff40: 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20  ex->iDb);.  }.  
ff50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff60: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ff70: 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29 3b  pIndex->iDb, 0);
ff80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  .  sqlite3VdbeOp
ff90: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
ffa0: 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20  e, iIdx, tnum,. 
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65     (char*)&pInde
ffd0: 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  x->keyInfo, P3_K
ffe0: 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
fff0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10000 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
10010 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  >iDb, 0);.  sqli
10020 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10030 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
10040 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  b, pTab->tnum);.
10050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10060 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
10070 6f 6c 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70 54  olumns, iTab, pT
10080 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 61 64 64  ab->nCol);.  add
10090 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
100a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
100b0 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
100c0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
100d0 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
100e0 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 73 55 6e  x, iTab);.  isUn
100f0 69 71 75 65 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  ique = pIndex->o
10100 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
10110 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10120 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74  dOp(v, OP_IdxPut
10130 2c 20 69 49 64 78 2c 20 69 73 55 6e 69 71 75 65  , iIdx, isUnique
10140 29 3b 0a 20 20 69 66 28 20 69 73 55 6e 69 71 75  );.  if( isUniqu
10150 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
10160 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
10170 2d 31 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  -1, "indexed col
10180 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
10190 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
101a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
101b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
101c0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
101d0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
101e0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
101f0 64 72 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65  dr1, sqlite3Vdbe
10200 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
10210 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10220 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
10230 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c   iTab, 0);.  sql
10240 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10250 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c   OP_Close, iIdx,
10260 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   0);.}../*.** Cr
10270 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
10280 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
10290 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
102a0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
102b0 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
102c0 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
102d0 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
102e0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
102f0 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
10300 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
10310 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
10320 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
10330 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
10340 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
10350 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
10360 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
10370 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
10380 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10390 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
103a0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
103b0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
103c0 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
103d0 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
103e0 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
103f0 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
10400 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
10410 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
10420 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
10430 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
10440 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
10450 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
10460 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
10470 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
10480 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
10490 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
104a0 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
104b0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
104c0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
104d0 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
104e0 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
104f0 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
10500 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  se,   /* All inf
10510 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
10520 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
10530 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
10540 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
10550 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
10560 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
10570 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
10580 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
10590 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
105a0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
105b0 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
105c0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e    /* Table to in
105d0 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
105e0 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
105f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10600 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
10610 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
10620 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
10630 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
10640 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
10650 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
10660 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
10670 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
10680 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
10690 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
106a0 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
106b0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
106c0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
106d0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
106e0 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
106f0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
10700 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
10710 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
10720 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
10730 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
10740 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f  x *pIndex = 0; /
10750 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
10760 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
10770 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
10780 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
10790 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f  ken nullId;    /
107a0 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72  * Fake token for
107b0 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73   an empty ID lis
107c0 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  t */.  DbFixer s
107d0 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61  Fix;    /* For a
107e0 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
107f0 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
10800 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  e */.  int isTem
10810 70 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p;      /* True 
10820 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
10830 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74  index */.  sqlit
10840 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10850 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b  >db;..  int iDb;
10860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10870 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
10880 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
10890 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
108a0 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
108b0 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
108c0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
108d0 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
108e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
108f0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
10900 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
10910 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10920 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  dex;..  /*.  ** 
10930 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
10940 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
10950 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
10960 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
10970 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
10980 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
10990 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
109a0 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
109b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
109c0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
109d0 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
109e0 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
109f0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
10a00 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
10a10 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
10a20 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
10a30 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
10a40 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
10a50 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
10a60 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
10a70 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
10a80 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
10a90 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
10aa0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10ab0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
10ac0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
10ad0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
10ae0 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
10af0 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
10b00 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
10b10 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
10b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10b30 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
10b40 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
10b50 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
10b60 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
10b70 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
10b80 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
10b90 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44  pTab && pTab->iD
10ba0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44  b==1 ){.      iD
10bb0 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  b = 1;.    }..  
10bc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
10bd0 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
10be0 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22  se, iDb, "index"
10bf0 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20  , pName) &&.    
10c00 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72      sqlite3FixSr
10c10 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
10c20 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20  lName).    ){.  
10c30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
10c40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10c50 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
10c60 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
10c70 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
10c80 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  ->a[0].zName, . 
10c90 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d         pTblName-
10ca0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
10cb0 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
10cc0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
10cd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
10ce0 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62 2d  sert( iDb==pTab-
10cf0 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  >iDb );.  }else{
10d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
10d10 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
10d20 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
10d30 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62 20  wTable;.    iDb 
10d40 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d  = pTab->iDb;.  }
10d50 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
10d60 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10d70 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
10d80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
10d90 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
10da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10db0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
10dc0 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
10dd0 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
10de0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
10df0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10e00 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
10e10 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
10e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10e30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
10e40 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
10e50 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
10e60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10e70 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54  index;.  }.  isT
10e80 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d  emp = pTab->iDb=
10e90 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  =1;..  /*.  ** F
10ea0 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
10eb0 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
10ec0 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
10ed0 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
10ee0 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
10ef0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
10f00 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
10f10 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
10f20 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
10f30 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
10f40 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
10f50 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
10f60 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
10f70 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
10f80 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
10f90 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
10fa0 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
10fb0 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
10fc0 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
10fd0 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
10fe0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
10ff0 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
11000 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
11010 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
11020 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
11030 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
11040 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
11050 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
11060 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
11070 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
11080 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
11090 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
110a0 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
110b0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
110c0 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
110d0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
110e0 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
110f0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
11100 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
11110 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
11120 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11130 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
11140 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
11150 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11160 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ex;.    if( SQLI
11170 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
11180 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
11190 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
111a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
111b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
111c0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
111d0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
111e0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d      Index *pISam
111f0 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f  eName;    /* Ano
11200 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20  ther index with 
11210 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f  the same name */
11220 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
11230 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
11240 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
11250 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
11260 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
11270 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
11280 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
11290 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
112a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
112b0 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61 6d        if( (pISam
112c0 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
112d0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
112e0 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
112f0 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20  .zName))!=0 ){. 
11300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11310 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11320 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
11330 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
11340 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
11350 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11370 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20  if( (pTSameName 
11380 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
11390 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
113a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
113b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
113c0 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
113d0 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
113e0 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
113f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
11400 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11410 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
11420 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
11430 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63  Name==0 ){.    c
11440 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
11450 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
11460 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
11470 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
11480 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
11490 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
114a0 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
114b0 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22    sprintf(zBuf,"
114c0 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61  _%d",n);.    zNa
114d0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
114e0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
114f0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
11500 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e  oindex_", pTab->
11510 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68  zName, zBuf, (ch
11520 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20  ar*)0);.    if( 
11530 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
11540 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11550 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  x;.  }..  /* Che
11560 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
11570 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
11580 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
11590 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
115a0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
115b0 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
115c0 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
115d0 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
115e0 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
115f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11600 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
11610 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
11620 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
11630 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11640 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11650 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
11660 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
11670 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73  NDEX;.    if( is
11680 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54  Temp ) i = SQLIT
11690 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
116a0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
116b0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
116c0 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
116d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
116e0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
116f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11700 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
11710 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
11720 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
11730 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
11740 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
11750 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
11760 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
11770 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
11780 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
11790 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
117a0 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
117b0 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
117c0 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
117d0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
117e0 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
117f0 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
11800 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
11810 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
11820 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
11830 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
11840 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11850 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
11860 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
11870 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
11880 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
118a0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
118b0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
118c0 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
118d0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
118e0 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
118f0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
11900 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
11910 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
11920 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
11930 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73  (CollSeq*))*pLis
11940 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66  t->nExpr );.  if
11950 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f  ( pIndex==0 ) go
11960 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11970 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ndex;.  pIndex->
11980 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
11990 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
119a0 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e  o.aColl[pList->n
119b0 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  Expr];.  pIndex-
119c0 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
119d0 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
119e0 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  n[pList->nExpr];
119f0 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
11a00 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
11a10 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
11a20 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
11a30 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
11a40 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
11a50 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
11a60 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
11a70 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
11a80 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65  Name==0;.  pInde
11a90 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20  x->iDb = iDb;.. 
11aa0 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
11ab0 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
11ac0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
11ad0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
11ae0 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
11af0 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
11b00 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
11b10 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
11b20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
11b30 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
11b40 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
11b50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
11b60 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11b70 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
11b80 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
11b90 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11ba0 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
11bb0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
11bc0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
11bd0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
11be0 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
11bf0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
11c00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11c10 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
11c20 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
11c30 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
11c40 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
11c50 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  e, pList->a[i].z
11c60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
11c70 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11c80 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
11c90 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
11ca0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20  i] = j;.    if( 
11cb0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11cc0 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
11cd0 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t( pList->a[i].p
11ce0 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
11cf0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
11d00 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
11d10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11d20 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  r->pColl;.    }e
11d30 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  lse{.      pInde
11d40 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
11d50 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  [i] = pTab->aCol
11d60 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  [j].pColl;.    }
11d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
11d80 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
11d90 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28  ll[i] );.    if(
11da0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
11db0 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
11dc0 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
11dd0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
11de0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
11df0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
11e00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11e10 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11e20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  }.  pIndex->keyI
11e30 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69  nfo.nField = pLi
11e40 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
11e50 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
11e60 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
11e70 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
11e80 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
11e90 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
11ea0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
11eb0 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
11ec0 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
11ed0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
11ee0 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
11ef0 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
11f00 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
11f10 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
11f20 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
11f30 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
11f40 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
11f50 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
11f60 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
11f70 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
11f80 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
11f90 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
11fa0 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
11fb0 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
11fc0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
11fd0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
11fe0 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
11ff0 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
12000 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
12010 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
12020 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
12030 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
12040 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
12050 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
12060 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
12070 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
12080 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
12090 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
120a0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
120b0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
120c0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
120d0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
120e0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
120f0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
12100 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
12110 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
12120 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ne );.      asse
12130 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e  rt( pIdx->autoIn
12140 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dex );.      ass
12150 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ert( pIndex->onE
12160 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
12170 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
12180 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65  ->nColumn!=pInde
12190 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  x->nColumn ) con
121a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
121b0 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43  (k=0; k<pIdx->nC
121c0 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20  olumn; k++){.   
121d0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
121e0 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
121f0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
12200 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
12210 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e   if( pIdx->keyIn
12220 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e  fo.aColl[k]!=pIn
12230 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
12240 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ll[k] ) break;. 
12250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12260 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
12270 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
12280 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
12290 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
122a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
122b0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
122c0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
122d0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
122e0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
122f0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
12300 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
12310 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
12320 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
12330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
12340 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
12350 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
12360 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
12370 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
12380 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
12390 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
123a0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
123b0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
123c0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
123d0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
123e0 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
123f0 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
12400 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
12410 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
12420 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
12430 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
12440 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
12450 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
12460 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
12470 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
12480 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
12490 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
124a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
124b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
124c0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
124d0 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
124e0 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
124f0 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
12500 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
12510 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
12520 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
12530 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
12540 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
12550 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
12560 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
12570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12580 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
12590 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
125a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
125b0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
125c0 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
125d0 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
125e0 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
125f0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
12600 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
12610 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
12620 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
12630 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
12640 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
12650 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
12660 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
12670 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20  Db].idxHash, .  
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12690 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
126a0 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e  Name, strlen(pIn
126b0 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  dex->zName)+1, p
126c0 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
126d0 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
126e0 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
126f0 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
12700 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
12710 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12720 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12730 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
12740 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
12750 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
12760 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
12770 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
12780 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
12790 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
127a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
127b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
127c0 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
127d0 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
127e0 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
127f0 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
12800 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
12810 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
12820 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
12830 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
12840 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
12850 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
12860 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
12870 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
12880 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
12890 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
128a0 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
128b0 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
128c0 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
128d0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
128e0 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
128f0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
12900 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
12910 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
12920 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
12930 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
12940 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
12950 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
12960 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
12970 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
12980 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
12990 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
129a0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
129b0 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
129c0 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
129d0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
129e0 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
129f0 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
12a00 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
12a10 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
12a20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
12a30 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
12a40 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
12a50 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
12a60 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
12a70 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
12a80 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
12a90 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
12aa0 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
12ab0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
12ac0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
12ad0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
12ae0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20  arse->nMem++;.. 
12af0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
12b00 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12b10 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
12b20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12b30 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  ndex;..    /* Cr
12b40 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
12b50 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
12b60 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
12b70 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
12b80 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
12b90 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
12ba0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12bb0 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
12bc0 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
12bd0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12be0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
12bf0 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  m, 0);..    /* G
12c00 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
12c10 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
12c20 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
12c30 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
12c40 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
12c50 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
12c60 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
12c70 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nd ){.      /* A
12c80 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
12c90 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
12ca0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
12cb0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
12cc0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
12cd0 69 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49  intf("CREATE%s I
12ce0 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
12cf0 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
12d00 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
12d10 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 41  IQUE",.        A
12d20 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
12d30 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20  ddr(pName->z) + 
12d40 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  1,.        pName
12d50 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
12d60 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
12d70 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
12d80 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
12d90 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
12da0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
12db0 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
12dc0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
12dd0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
12de0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
12df0 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
12e00 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
12e10 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
12e20 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
12e30 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
12e40 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
12e50 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
12e60 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
12e70 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b  x',%Q,%Q,#0,%Q);
12e80 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
12e90 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
12ea0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
12eb0 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ,.        pIndex
12ec0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
12ed0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
12ee0 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
12ef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12f00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
12f10 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
12f20 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b  liteFree(zStmt);
12f30 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
12f40 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
12f50 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
12f60 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2f 0a  e schema.    */.
12f70 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
12f80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12f90 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
12fa0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
12fb0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
12fc0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
12fd0 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
12fe0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
12ff0 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
13000 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  a, iDb, 0,.     
13010 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
13020 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  tf("name='%q'", 
13030 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
13040 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
13050 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65   }.  }..  /* Whe
13060 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
13070 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
13080 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
13090 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
130a0 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
130b0 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
130c0 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
130d0 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
130e0 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
130f0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
13100 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
13110 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
13120 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64   UPDATE.  ** and
13130 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20   INSERT..  */.  
13140 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
13150 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
13160 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
13170 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
13180 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
13190 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
131a0 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
131b0 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
131c0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
131d0 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
131e0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
131f0 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
13200 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
13210 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
13220 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
13230 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
13240 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
13250 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
13260 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
13270 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
13280 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
13290 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
132a0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
132b0 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
132c0 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
132d0 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
132e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
132f0 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
13300 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
13310 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
13320 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
13330 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
13340 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
13350 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ndex);.  }.  sql
13360 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
13370 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
13380 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
13390 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  e(pTblName);.  s
133a0 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
133b0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
133c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
133d0 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
133e0 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
133f0 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
13400 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
13410 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
13420 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
13430 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
13440 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
13450 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
13460 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
13470 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
13480 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13490 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
134a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
134b0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
134c0 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
134d0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  n;.  assert( pNa
134e0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
134f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13500 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
13510 61 28 70 50 61 72 73 65 29 20 29 20 72 65 74 75  a(pParse) ) retu
13520 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  rn;.  pIndex = s
13530 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
13540 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
13550 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
13560 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
13570 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
13580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13590 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
135a0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
135b0 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
135c0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
135d0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
135e0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
135f0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
13600 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
13610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13620 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13630 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
13640 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
13650 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
13660 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
13670 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
13680 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
13690 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
136a0 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
136b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
136c0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
136d0 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
136e0 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
136f0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
13700 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
13710 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13720 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
13730 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Index->iDb].zNam
13740 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13750 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
13760 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69  _TABLE(pIndex->i
13770 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
13780 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13790 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
137a0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
137b0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
137c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
137d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
137e0 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f  pIndex->iDb ) co
137f0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13800 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
13810 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13820 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
13830 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
13840 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
13850 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
13860 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
13870 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
13880 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
13890 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
138a0 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
138b0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
138c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
138d0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
138e0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
138f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
13900 20 70 49 6e 64 65 78 2d 3e 69 44 62 3b 0a 20 20   pIndex->iDb;.  
13910 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13920 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
13930 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
13940 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d   %Q.%s WHERE nam
13950 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62  e=%Q",.       db
13960 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
13970 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
13980 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64  Db),.       pInd
13990 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ex->zName.    );
139a0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
139b0 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
139c0 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
139d0 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
139e0 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
139f0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
13a00 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44  3VdbeOp3(v, OP_D
13a10 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
13a20 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
13a30 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
13a40 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
13a50 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
13a60 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
13a70 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
13a80 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
13a90 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
13aa0 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
13ab0 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
13ac0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
13ad0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
13ae0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
13af0 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
13b00 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
13b10 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73  ListAppend(IdLis
13b20 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
13b30 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
13b40 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
13b50 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
13b60 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c  lloc( sizeof(IdL
13b70 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
13b80 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
13b90 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
13ba0 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a  nAlloc = 0;.  }.
13bb0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64    if( pList->nId
13bc0 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
13bd0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
13be0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
13bf0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
13c00 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
13c10 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 5;.    a = s
13c20 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
13c30 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41  st->a, pList->nA
13c40 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73  lloc*sizeof(pLis
13c50 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
13c60 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
13c70 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
13c80 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
13c90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
13ca0 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
13cb0 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   = a;.  }.  mems
13cc0 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
13cd0 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a  st->nId], 0, siz
13ce0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
13cf0 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c  );.  pList->a[pL
13d00 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20  ist->nId].zName 
13d10 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
13d20 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
13d30 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a    pList->nId++;.
13d40 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
13d50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
13d60 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
13d70 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
13d80 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
13d90 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
13da0 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
13db0 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
13dc0 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
13dd0 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
13de0 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
13df0 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   A new SrcList i
13e00 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
13e10 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
13e20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fails..**.** If 
13e30 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
13e40 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
13e50 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
13e60 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
13e70 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
13e80 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
13e90 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
13ea0 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
13eb0 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
13ec0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
13ed0 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
13ee0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
13ef0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
13f00 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
13f10 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
13f20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
13f30 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
13f40 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
13f50 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
13f60 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
13f70 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
13f80 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
13f90 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
13fa0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
13fb0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
13fc0 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
13fd0 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
13fe0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
13ff0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
14000 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
14010 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
14020 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
14030 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
14040 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a  Append(A,B,0);.*
14050 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
14060 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
14070 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
14080 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
14090 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
140a0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
140b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
140c0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
140d0 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
140e0 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
140f0 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
14100 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
14110 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
14120 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
14130 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
14140 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c  , Token *pTable,
14150 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
14160 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  e){.  struct Src
14170 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
14180 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
14190 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
141a0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
141b0 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
141c0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
141d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
141e0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
141f0 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
14200 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73  List->nSrc>=pLis
14210 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
14220 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
14230 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
14240 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77  c *= 2;.    pNew
14250 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
14260 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  (pList,.        
14270 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
14280 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e  List) + (pList->
14290 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
142a0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
142b0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
142c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
142d0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
142e0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
142f0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
14300 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
14310 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
14320 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
14330 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  rc];.  memset(pI
14340 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  tem, 0, sizeof(p
14350 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
14360 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
14370 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
14380 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
14390 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
143a0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
143b0 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
143c0 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
143d0 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
143e0 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
143f0 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
14400 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
14410 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
14420 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
14430 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
14440 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
14450 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
14460 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74  Database);.  pIt
14470 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31  em->iCursor = -1
14480 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b  ;.  pList->nSrc+
14490 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
144a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
144b0 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  gn cursors to al
144c0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
144d0 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
144e0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
144f0 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
14500 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
14510 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
14520 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
14530 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
14540 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
14550 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30  ->a[i].iCursor<0
14560 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
14570 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
14580 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14590 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
145a0 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20  ** Add an alias 
145b0 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e  to the last iden
145c0 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69  tifier on the gi
145d0 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c  ven identifier l
145e0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
145f0 69 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c  ite3SrcListAddAl
14600 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ias(SrcList *pLi
14610 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
14620 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  n){.  if( pList 
14630 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30  && pList->nSrc>0
14640 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   ){.    pList->a
14650 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e  [pList->nSrc-1].
14660 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
14670 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
14680 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  oken);.  }.}../*
14690 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
146a0 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
146b0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
146c0 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
146d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
146e0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
146f0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
14700 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
14710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
14720 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
14730 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
14740 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
14750 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
14760 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
14770 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
14780 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
14790 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
147a0 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
147b0 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
147c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
147d0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
147e0 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
147f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
14800 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
14810 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14820 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
14830 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
14840 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
14850 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
14860 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
14870 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
14880 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
14890 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   -1;.}../*.** De
148a0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
148b0 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
148c0 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
148d0 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
148e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
148f0 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
14900 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
14910 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14920 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
14930 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14940 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
14950 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
14960 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
14970 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
14980 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
14990 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
149a0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
149b0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
149c0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
149d0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
149e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
149f0 20 26 26 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d   && pItem->pTab-
14a00 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
14a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
14a20 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
14a30 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  m->pTab);.    }.
14a40 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14a50 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
14a60 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
14a70 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
14a80 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
14a90 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
14aa0 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ete(pItem->pUsin
14ab0 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
14ac0 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
14ad0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
14ae0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
14af0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
14b00 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
14b10 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
14b20 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
14b30 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
14b40 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
14b50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
14b60 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
14b70 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
14b80 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
14b90 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
14ba0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14bb0 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
14bc0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
14bd0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14be0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
14bf0 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
14c00 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
14c10 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14c20 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14c30 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
14c40 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
14c50 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
14c60 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
14c70 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
14c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c90 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
14ca0 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
14cb0 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
14cc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14cd0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14ce0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
14cf0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
14d00 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
14d10 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14d20 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
14d30 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
14d40 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
14d50 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
14d60 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
14d70 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
14d80 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
14d90 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
14da0 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
14db0 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
14dc0 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
14dd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14de0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14df0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14e00 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
14e10 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20  OMMIT", 0, 0) ) 
14e20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
14e30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14e40 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
14e50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14e60 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
14e70 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
14e80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
14e90 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
14ea0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14eb0 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
14ec0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
14ed0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
14ee0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
14ef0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14f00 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14f10 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14f20 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14f30 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14f40 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14f50 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14f60 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
14f70 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14f80 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14f90 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
14fa0 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
14fb0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
14fc0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14fd0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14fe0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
14ff0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15000 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
15010 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
15020 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
15030 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
15040 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
15050 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
15060 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
15070 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
15080 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
15090 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
150a0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
150b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
150c0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
150d0 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
150e0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
150f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15100 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
15110 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
15120 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
15130 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
15140 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
15150 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f  y(db, 0, 0, MAX_
15160 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b  PAGES, &db->aDb[
15170 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
15180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15190 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
151a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
151b0 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
151c0 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
151d0 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
151e0 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
151f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15200 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
15210 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
15220 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15230 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  }.    if( db->fl
15240 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43  ags & !db->autoC
15250 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72  ommit ){.      r
15260 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15270 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61  BeginTrans(db->a
15280 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20  Db[1].pBt, 1);. 
15290 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
152a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
152b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
152c0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
152d0 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65  e to get a write
152e0 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20   lock on ".     
152f0 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72       "the tempor
15300 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
15310 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  e");.        pPa
15320 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
15330 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15350 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15360 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15370 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
15380 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
15390 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64  chema cookie and
153a0 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64   start.** a read
153b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
153c0 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62   all named datab
153d0 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ase files..**.**
153e0 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
153f0 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61   that all schema
15400 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69   cookies be veri
15410 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  fied and all.** 
15420 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
15430 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  s be started bef
15440 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ore anything els
15450 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20  e happens in.** 
15460 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
15470 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
15480 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  ine can be calle
15490 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68  d after much oth
154a0 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62  er.** code has b
154b0 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20  een generated.  
154c0 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20  So here is what 
154d0 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  we do:.**.** The
154e0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
154f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15500 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f  ed, we code an O
15510 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77  P_Goto that.** w
15520 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75  ill jump to a su
15530 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20  broutine at the 
15540 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72  end of the progr
15550 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20  am.  Then we.** 
15560 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74  record every dat
15570 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73  abase that needs
15580 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69   its schema veri
15590 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fied in the.** p
155a0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
155b0 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c  k field.  Later,
155c0 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72   after all other
155d0 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a   code has been.*
155e0 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65  * generated, the
155f0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
15600 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65   does the cookie
15610 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61   verifications a
15620 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65  nd.** starts the
15630 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69   transactions wi
15640 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20  ll be coded and 
15650 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76  the OP_Goto P2 v
15660 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
15670 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
15680 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65   that subroutine
15690 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f  .  The generatio
156a0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  n of the.** cook
156b0 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ie verification 
156c0 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20  subroutine code 
156d0 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74  happens in sqlit
156e0 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
156f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
15700 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f   then code the O
15710 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f  P_Goto only - do
15720 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20  n't set flag to 
15730 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63  verify the.** sc
15740 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61  hema on any data
15750 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e  bases.  This can
15760 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69   be used to posi
15770 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f  tion the OP_Goto
15780 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65  .** early in the
15790 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65   code, before we
157a0 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74   know if any dat
157b0 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c  abase tables wil
157c0 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  l be used..*/.vo
157d0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
157e0 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
157f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
15800 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
15810 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
15820 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d  int mask;..  v =
15830 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15840 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
15850 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
15860 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
15870 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73  ens if there was
15880 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a   a prior error *
15890 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
158a0 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >db;.  if( pPars
158b0 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30  e->cookieGoto==0
158c0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
158d0 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
158e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
158f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b   OP_Goto, 0, 0)+
15900 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  1;.  }.  if( iDb
15910 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  >=0 ){.    asser
15920 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
15930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
15940 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
15950 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
15960 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33     assert( iDb<3
15970 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  2 );.    mask = 
15980 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20  1<<iDb;.    if( 
15990 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d  (pParse->cookieM
159a0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
159b0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
159c0 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
159d0 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  sk;.      pParse
159e0 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
159f0 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  b] = db->aDb[iDb
15a00 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ].schema_cookie;
15a10 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
15a20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
15a30 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
15a40 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20  base(pParse);.  
15a50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15a60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15a70 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
15a80 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
15a90 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
15aa0 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
15ab0 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
15ac0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
15ad0 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
15ae0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
15af0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
15b00 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
15b10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
15b20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
15b30 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
15b40 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
15b50 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
15b60 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
15b70 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
15b80 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
15b90 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
15ba0 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
15bb0 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
15bc0 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
15bd0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
15be0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
15bf0 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
15c00 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
15c10 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
15c20 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
15c30 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
15c40 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
15c50 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
15c60 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
15c70 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
15c80 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
15c90 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
15ca0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
15cb0 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
15cc0 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
15cd0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
15ce0 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
15cf0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
15d00 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ot be set..**.**
15d10 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69   Only database i
15d20 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  Db and the temp 
15d30 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
15d40 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68  e writable by th
15d50 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69  is call..** If i
15d60 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Db==0, then the 
15d70 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61  main and temp da
15d80 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65  tabases are made
15d90 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a   writable.   If.
15da0 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f  ** iDb==1 then o
15db0 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74  nly the temp dat
15dc0 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72  abase is made wr
15dd0 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e  itable.  If iDb>
15de0 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70  1 then the.** sp
15df0 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72  ecified auxiliar
15e00 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  y database and t
15e10 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
15e20 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
15e30 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
15e40 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
15e50 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
15e60 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
15e70 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
15e80 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
15e90 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15ea0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
15eb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
15ec0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
15ed0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
15ee0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69  );.  pParse->wri
15ef0 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62  teMask |= 1<<iDb
15f00 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65  ;.  if( setState
15f10 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e  ment && pParse->
15f20 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
15f30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15f40 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e  p(v, OP_Statemen
15f50 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a  t, iDb, 0);.  }.
15f60 20 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20    if( iDb!=1 && 
15f70 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
15f80 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20  1].pBt!=0 ){.   
15f90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
15fa0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
15fb0 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74  se, setStatement
15fc0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  , 1);.  }.}../* 
15fd0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
15fe0 72 61 6e 73 69 65 6e 74 20 73 71 6c 69 74 65 33  ransient sqlite3
15ff0 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 75 73  _value object us
16000 65 64 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20  ed for encoding 
16010 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 64  conversions.** d
16020 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d 70 69 6c  uring SQL compil
16030 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ation..*/.sqlite
16040 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
16050 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75  GetTransientValu
16060 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
16070 20 20 69 66 28 20 21 64 62 2d 3e 70 56 61 6c 75    if( !db->pValu
16080 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 61  e ){.    db->pVa
16090 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  lue = sqlite3Val
160a0 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a 20 20 72  ueNew();.  }.  r
160b0 65 74 75 72 6e 20 64 62 2d 3e 70 56 61 6c 75 65  eturn db->pValue
160c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
160d0 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
160e0 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
160f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
16100 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
16110 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
16120 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
16130 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
16140 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16150 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
16160 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
16170 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  ch(CollSeq *pCol
16180 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
16190 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 6e  ){.  int n = pIn
161a0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
161b0 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  eld;.  CollSeq *
161c0 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65  *pp = pIndex->ke
161d0 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77  yInfo.aColl;.  w
161e0 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20  hile( n-- ){.   
161f0 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20   if( *pp==pColl 
16200 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
16210 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pp++;.  }.  retu
16220 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
16230 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
16240 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
16250 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
16260 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
16270 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
16280 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
16290 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
162a0 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
162b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
162c0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
162d0 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
162e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
162f0 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c 53  ble *pTab, CollS
16300 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e  eq *pColl){.  In
16310 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
16320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16330 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16340 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
16350 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
16360 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
16370 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
16380 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
16390 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   pColl==0 || col
163a0 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f 6c  lationMatch(pCol
163b0 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  l,pIndex) ){.   
163c0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
163d0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
163e0 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69  arse, 0, pTab->i
163f0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
16400 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
16410 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
16420 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
16430 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
16440 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
16450 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
16460 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
16470 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
16480 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
16490 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
164a0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
164b0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
164c0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
164d0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
164e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
164f0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
16500 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
16510 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
16520 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
16530 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16550 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
16560 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
16570 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
16580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16590 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
165a0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
165b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
165c0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
165d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
165e0 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
165f0 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
16600 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
16610 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
16620 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
16630 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
16640 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
16650 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16660 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
16670 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
16680 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
16690 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69  +, pDb++){.    i
166a0 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74  f( pDb==0 ) cont
166b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
166c0 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
166d0 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29  t(&pDb->tblHash)
166e0 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
166f0 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
16700 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
16710 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
16720 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
16730 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
16740 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, pColl);.   
16750 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
16760 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16770 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
16780 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
16790 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
167a0 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
167c0 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
167d0 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
167e0 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
167f0 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
16800 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
16810 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
16820 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
16830 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
16840 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
16850 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
16860 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
16870 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
16880 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
16890 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
168a0 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
168b0 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
168c0 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
168d0 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
168e0 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
168f0 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
16900 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
16910 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
16920 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
16930 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
16940 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
16950 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
16960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
16970 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
16980 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
16990 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
169a0 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
169b0 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
169c0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
169d0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
169e0 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
169f0 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
16a00 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
16a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16a20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16a30 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
16a40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
16a50 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
16a60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16a70 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
16a80 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
16a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16aa0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
16ab0 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
16ac0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
16ad0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
16ae0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
16af0 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
16b00 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
16b10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16b20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
16b30 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
16b40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16b50 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
16b60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16b70 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
16b80 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
16b90 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
16ba0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
16bb0 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
16bc0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65   */..  if( pName
16bd0 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e  1==0 || pName1->
16be0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  z==0 ){.    rein
16bf0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
16c00 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
16c10 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
16c20 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e   pName2==0 || pN
16c30 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
16c40 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
16c50 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
16c60 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65 31   db->enc, pName1
16c70 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20  ->z, pName1->n, 
16c80 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
16c90 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
16ca0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
16cb0 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, pColl);.    
16cc0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
16cd0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
16ce0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
16cf0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
16d00 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
16d10 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
16d20 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
16d30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
16d40 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  ken(pObjName);. 
16d50 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
16d60 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  Db].zName;.  pTa
16d70 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
16d80 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29  able(db, z, zDb)
16d90 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
16da0 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
16db0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
16dc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
16dd0 65 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(z);.    return
16de0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
16df0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
16e00 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
16e10 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
16e20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
16e30 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
16e40 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
16e50 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
16e60 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
16e70 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
16e80 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
16e90 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
16ea0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16eb0 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
16ec0 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
16ed0 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
16ee0 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
16ef0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16f00 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
16f10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16f20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
16f30 74 20 74 68 65 20 22 41 4c 54 45 52 20 54 41 42  t the "ALTER TAB
16f40 4c 45 20 78 78 78 20 52 45 4e 41 4d 45 20 54 4f  LE xxx RENAME TO
16f50 20 79 79 79 22 20 0a 2a 2a 20 63 6f 6d 6d 61 6e   yyy" .** comman
16f60 64 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  d. .*/.void sqli
16f70 74 65 33 41 6c 74 65 72 52 65 6e 61 6d 65 54 61  te3AlterRenameTa
16f80 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
16f90 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
16fa0 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
16fb0 78 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  xt. */.  SrcList
16fc0 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
16fd0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
16fe0 74 6f 20 72 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20  to rename. */.  
16ff0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20 20  Token *pName    
17000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17010 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e   new table name.
17020 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
17030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17040 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
17050 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
17060 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72   table */.  char
17070 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
17080 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
17090 20 64 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f   database iDb */
170a0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170c0 54 61 62 6c 65 20 62 65 69 6e 67 20 72 65 6e 61  Table being rena
170d0 6d 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  med */.  char *z
170e0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
170f0 20 20 20 2f 2a 20 4e 55 4c 4c 2d 74 65 72 6d 69     /* NULL-termi
17100 6e 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  nated version of
17110 20 70 4e 61 6d 65 20 2a 2f 20 0a 20 20 63 68 61   pName */ .  cha
17120 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20  r *zWhere = 0;  
17130 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
17140 63 6c 61 75 73 65 20 6f 66 20 73 63 68 65 6d 61  clause of schema
17150 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 70   elements to rep
17160 61 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  arse */.  sqlite
17170 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17180 64 62 3b 20 2f 2a 20 44 61 74 61 62 61 73 65 20  db; /* Database 
17190 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
171a0 56 64 62 65 20 2a 76 3b 0a 23 69 66 6e 64 65 66  Vdbe *v;.#ifndef
171b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
171c0 47 47 45 52 0a 20 20 63 68 61 72 20 2a 7a 54 65  GGER.  char *zTe
171d0 6d 70 54 72 69 67 20 3d 20 30 3b 20 20 20 20 20  mpTrig = 0;     
171e0 20 2f 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65   /* Where clause
171f0 20 74 6f 20 6c 6f 63 61 74 65 20 74 65 6d 70 20   to locate temp 
17200 74 72 69 67 67 65 72 73 20 2a 2f 0a 23 65 6e 64  triggers */.#end
17210 69 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  if.  .  assert( 
17220 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  pSrc->nSrc==1 );
17230 0a 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ..  pTab = sqlit
17240 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
17250 61 72 73 65 2c 20 70 53 72 63 2d 3e 61 5b 30 5d  arse, pSrc->a[0]
17260 2e 7a 4e 61 6d 65 2c 20 70 53 72 63 2d 3e 61 5b  .zName, pSrc->a[
17270 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
17280 20 69 66 28 20 21 70 54 61 62 20 29 20 72 65 74   if( !pTab ) ret
17290 75 72 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  urn;.  iDb = pTa
172a0 62 2d 3e 69 44 62 3b 0a 20 20 7a 44 62 20 3d 20  b->iDb;.  zDb = 
172b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
172c0 6d 65 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20  me;..  /* Get a 
172d0 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 20  NULL terminated 
172e0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6e  version of the n
172f0 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a  ew table name. *
17300 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
17310 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
17320 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  (pName);.  if( !
17330 7a 4e 61 6d 65 20 29 20 72 65 74 75 72 6e 3b 0a  zName ) return;.
17340 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
17350 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
17360 78 20 6e 61 6d 65 64 20 27 7a 4e 61 6d 65 27 20  x named 'zName' 
17370 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
17380 20 65 78 69 73 74 0a 20 20 2a 2a 20 69 6e 20 64   exist.  ** in d
17390 61 74 61 62 61 73 65 20 69 44 62 2e 20 49 66 20  atabase iDb. If 
173a0 73 6f 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65  so, this is an e
173b0 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
173c0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
173d0 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
173e0 29 20 7c 7c 20 73 71 6c 69 74 65 33 46 69 6e 64  ) || sqlite3Find
173f0 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
17400 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 73 71 6c   zDb) ){.    sql
17410 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17420 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 74  rse, .        "t
17430 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
17440 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72  another table or
17450 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 69 73   index with this
17460 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d   name: %s", zNam
17470 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
17480 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
17490 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  eturn;.  }..#ifn
174a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
174b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
174c0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 61 75  /* Invoke the au
174d0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
174e0 62 61 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 73  back. */.  if( s
174f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
17500 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 41  pParse, SQLITE_A
17510 4c 54 45 52 5f 54 41 42 4c 45 2c 20 7a 44 62 2c  LTER_TABLE, zDb,
17520 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
17530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
17540 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
17550 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
17560 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61 20  f..  /* Begin a 
17570 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17580 63 6f 64 65 20 74 68 65 20 56 65 72 69 66 79 43  code the VerifyC
17590 6f 6f 6b 69 65 20 66 6f 72 20 64 61 74 61 62 61  ookie for databa
175a0 73 65 20 69 44 62 2e 20 0a 20 20 2a 2a 20 54 68  se iDb. .  ** Th
175b0 65 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63  en modify the sc
175c0 68 65 6d 61 20 63 6f 6f 6b 69 65 20 28 73 69 6e  hema cookie (sin
175d0 63 65 20 74 68 65 20 41 4c 54 45 52 20 54 41 42  ce the ALTER TAB
175e0 4c 45 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a  LE modifies the.
175f0 20 20 2a 2a 20 73 63 68 65 6d 61 29 2e 0a 20 20    ** schema)..  
17600 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
17610 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
17620 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
17630 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
17640 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
17650 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
17660 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
17670 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
17680 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61  b);.  sqlite3Cha
17690 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
176a0 20 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 64   iDb);..  /* Mod
176b0 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
176c0 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 75  aster table to u
176d0 73 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  se the new table
176e0 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   name. */.  sqli
176f0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
17700 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
17710 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 22  DATE %Q.%s SET "
17720 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
17730 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
17740 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73 71 6c        "sql = sql
17750 69 74 65 5f 61 6c 74 65 72 5f 74 61 62 6c 65 28  ite_alter_table(
17760 73 71 6c 2c 20 25 51 29 2c 20 22 0a 23 65 6c 73  sql, %Q), ".#els
17770 65 0a 20 20 20 20 20 20 20 20 20 20 22 73 71 6c  e.          "sql
17780 20 3d 20 43 41 53 45 20 22 0a 20 20 20 20 20 20   = CASE ".      
17790 20 20 20 20 20 20 22 57 48 45 4e 20 74 79 70 65        "WHEN type
177a0 20 3d 20 27 74 72 69 67 67 65 72 27 20 54 48 45   = 'trigger' THE
177b0 4e 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74  N sqlite_alter_t
177c0 72 69 67 67 65 72 28 73 71 6c 2c 20 25 51 29 22  rigger(sql, %Q)"
177d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4c  .            "EL
177e0 53 45 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f  SE sqlite_alter_
177f0 74 61 62 6c 65 28 73 71 6c 2c 20 25 51 29 20 45  table(sql, %Q) E
17800 4e 44 2c 20 22 0a 23 65 6e 64 69 66 0a 20 20 20  ND, ".#endif.   
17810 20 20 20 20 20 20 20 22 74 62 6c 5f 6e 61 6d 65         "tbl_name
17820 20 3d 20 25 51 2c 20 22 0a 20 20 20 20 20 20 20   = %Q, ".       
17830 20 20 20 22 6e 61 6d 65 20 3d 20 43 41 53 45 20     "name = CASE 
17840 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57  ".            "W
17850 48 45 4e 20 74 79 70 65 3d 27 74 61 62 6c 65 27  HEN type='table'
17860 20 54 48 45 4e 20 25 51 20 22 0a 20 20 20 20 20   THEN %Q ".     
17870 20 20 20 20 20 20 20 22 57 48 45 4e 20 6e 61 6d         "WHEN nam
17880 65 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 61  e LIKE 'sqlite_a
17890 75 74 6f 69 6e 64 65 78 25 25 27 20 41 4e 44 20  utoindex%%' AND 
178a0 74 79 70 65 3d 27 69 6e 64 65 78 27 20 54 48 45  type='index' THE
178b0 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  N ".            
178c0 20 20 22 27 73 71 6c 69 74 65 5f 61 75 74 6f 69    "'sqlite_autoi
178d0 6e 64 65 78 5f 27 20 7c 7c 20 25 51 20 7c 7c 20  ndex_' || %Q || 
178e0 73 75 62 73 74 72 28 6e 61 6d 65 2c 20 25 64 2b  substr(name, %d+
178f0 31 38 2c 31 30 29 20 22 0a 20 20 20 20 20 20 20  18,10) ".       
17900 20 20 20 20 20 22 45 4c 53 45 20 6e 61 6d 65 20       "ELSE name 
17910 45 4e 44 20 22 0a 20 20 20 20 20 20 22 57 48 45  END ".      "WHE
17920 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 41  RE tbl_name=%Q A
17930 4e 44 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  ND type IN ('tab
17940 6c 65 27 2c 20 27 69 6e 64 65 78 27 2c 20 27 74  le', 'index', 't
17950 72 69 67 67 65 72 27 29 3b 22 2c 20 0a 20 20 20  rigger');", .   
17960 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
17970 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
17980 42 4c 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c  BLE(iDb), zName,
17990 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a   zName, zName, z
179a0 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 7a 4e 61  Name, .      zNa
179b0 6d 65 2c 20 73 74 72 6c 65 6e 28 70 54 61 62 2d  me, strlen(pTab-
179c0 3e 7a 4e 61 6d 65 29 2c 20 70 54 61 62 2d 3e 7a  >zName), pTab->z
179d0 4e 61 6d 65 0a 20 20 29 3b 0a 0a 23 69 66 6e 64  Name.  );..#ifnd
179e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
179f0 52 49 47 47 45 52 0a 20 20 2f 2a 20 49 66 20 74  RIGGER.  /* If t
17a00 68 65 72 65 20 61 72 65 20 54 45 4d 50 20 74 72  here are TEMP tr
17a10 69 67 67 65 72 73 20 6f 6e 20 74 68 69 73 20 74  iggers on this t
17a20 61 62 6c 65 2c 20 6d 6f 64 69 66 79 20 74 68 65  able, modify the
17a30 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
17a40 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ter.  ** table. 
17a50 44 6f 6e 27 74 20 64 6f 20 74 68 69 73 20 69 66  Don't do this if
17a60 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
17a70 20 41 4c 54 45 52 65 64 20 69 73 20 69 74 73 65   ALTERed is itse
17a80 6c 66 20 6c 6f 63 61 74 65 64 20 69 6e 0a 20 20  lf located in.  
17a90 2a 2a 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ** the temp data
17aa0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
17ab0 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 54   iDb!=1 ){.    T
17ac0 72 69 67 67 65 72 20 2a 70 54 72 69 67 3b 0a 20  rigger *pTrig;. 
17ad0 20 20 20 63 68 61 72 20 2a 74 6d 70 20 3d 20 30     char *tmp = 0
17ae0 3b 0a 20 20 20 20 66 6f 72 28 20 70 54 72 69 67  ;.    for( pTrig
17af0 3d 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b  =pTab->pTrigger;
17b00 20 70 54 72 69 67 3b 20 70 54 72 69 67 3d 70 54   pTrig; pTrig=pT
17b10 72 69 67 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  rig->pNext ){.  
17b20 20 20 20 20 69 66 28 20 70 54 72 69 67 2d 3e 69      if( pTrig->i
17b30 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
17b40 20 69 66 28 20 21 7a 54 65 6d 70 54 72 69 67 20   if( !zTempTrig 
17b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
17b60 6d 70 54 72 69 67 20 3d 20 0a 20 20 20 20 20 20  mpTrig = .      
17b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
17b80 50 72 69 6e 74 66 28 22 74 79 70 65 20 3d 20 27  Printf("type = '
17b90 74 72 69 67 67 65 72 27 20 41 4e 44 20 6e 61 6d  trigger' AND nam
17ba0 65 20 49 4e 28 25 51 22 2c 20 70 54 72 69 67 2d  e IN(%Q", pTrig-
17bb0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
17bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17bd0 20 74 6d 70 20 3d 20 7a 54 65 6d 70 54 72 69 67   tmp = zTempTrig
17be0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  ;.          zTem
17bf0 70 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33 4d  pTrig = sqlite3M
17c00 50 72 69 6e 74 66 28 22 25 73 2c 20 25 51 22 2c  Printf("%s, %Q",
17c10 20 7a 54 65 6d 70 54 72 69 67 2c 20 70 54 72 69   zTempTrig, pTri
17c20 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  g->name);.      
17c30 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 74      sqliteFree(t
17c40 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mp);.        }. 
17c50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17c60 20 69 66 28 20 7a 54 65 6d 70 54 72 69 67 20 29   if( zTempTrig )
17c70 7b 0a 20 20 20 20 20 20 74 6d 70 20 3d 20 7a 54  {.      tmp = zT
17c80 65 6d 70 54 72 69 67 3b 0a 20 20 20 20 20 20 7a  empTrig;.      z
17c90 54 65 6d 70 54 72 69 67 20 3d 20 73 71 6c 69 74  TempTrig = sqlit
17ca0 65 33 4d 50 72 69 6e 74 66 28 22 25 73 29 22 2c  e3MPrintf("%s)",
17cb0 20 7a 54 65 6d 70 54 72 69 67 29 3b 0a 20 20 20   zTempTrig);.   
17cc0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d     sqliteFree(tm
17cd0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
17ce0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
17cf0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
17d00 22 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 74  "UPDATE sqlite_t
17d10 65 6d 70 5f 6d 61 73 74 65 72 20 53 45 54 20 22  emp_master SET "
17d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
17d30 73 71 6c 20 3d 20 73 71 6c 69 74 65 5f 61 6c 74  sql = sqlite_alt
17d40 65 72 5f 74 72 69 67 67 65 72 28 73 71 6c 2c 20  er_trigger(sql, 
17d50 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %Q), ".         
17d60 20 20 20 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d       "tbl_name =
17d70 20 25 51 20 22 0a 20 20 20 20 20 20 20 20 20 20   %Q ".          
17d80 20 20 20 20 22 57 48 45 52 45 20 25 73 3b 22 2c      "WHERE %s;",
17d90 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a   zName, zName, z
17da0 54 65 6d 70 54 72 69 67 29 3b 0a 20 20 20 20 7d  TempTrig);.    }
17db0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17dc0 2a 20 44 72 6f 70 20 74 68 65 20 65 6c 65 6d 65  * Drop the eleme
17dd0 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
17de0 6d 6f 72 79 20 73 63 68 65 6d 61 20 74 68 61 74  mory schema that
17df0 20 72 65 66 65 72 65 64 20 74 6f 20 74 68 65 20   refered to the 
17e00 74 61 62 6c 65 0a 20 20 2a 2a 20 72 65 6e 61 6d  table.  ** renam
17e10 65 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20  ed and load the 
17e20 6e 65 77 20 76 65 72 73 69 6f 6e 73 20 66 72 6f  new versions fro
17e30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
17e40 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
17e50 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 23 69  e->nErr==0 ){.#i
17e60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17e70 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 54 72  T_TRIGGER.    Tr
17e80 69 67 67 65 72 20 2a 70 54 72 69 67 3b 0a 20 20  igger *pTrig;.  
17e90 20 20 66 6f 72 28 20 70 54 72 69 67 3d 70 54 61    for( pTrig=pTa
17ea0 62 2d 3e 70 54 72 69 67 67 65 72 3b 20 70 54 72  b->pTrigger; pTr
17eb0 69 67 3b 20 70 54 72 69 67 3d 70 54 72 69 67 2d  ig; pTrig=pTrig-
17ec0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
17ed0 61 73 73 65 72 74 28 20 70 54 72 69 67 2d 3e 69  assert( pTrig->i
17ee0 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69 67  Db==iDb || pTrig
17ef0 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  ->iDb==1 );.    
17f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
17f10 28 76 2c 20 4f 50 5f 44 72 6f 70 54 72 69 67 67  (v, OP_DropTrigg
17f20 65 72 2c 20 70 54 72 69 67 2d 3e 69 44 62 2c 20  er, pTrig->iDb, 
17f30 30 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65 2c 20  0, pTrig->name, 
17f40 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
17f50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17f60 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op3(v, OP_DropTa
17f70 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61  ble, iDb, 0, pTa
17f80 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
17f90 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
17fa0 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e  e3MPrintf("tbl_n
17fb0 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b  ame=%Q", zName);
17fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17fd0 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(v, OP_ParseS
17fe0 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 7a  chema, iDb, 0, z
17ff0 57 68 65 72 65 2c 20 50 33 5f 44 59 4e 41 4d 49  Where, P3_DYNAMI
18000 43 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  C);.#ifndef SQLI
18010 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
18020 20 20 20 20 69 66 28 20 7a 54 65 6d 70 54 72 69      if( zTempTri
18030 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
18040 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
18050 50 61 72 73 65 53 63 68 65 6d 61 2c 20 31 2c 20  ParseSchema, 1, 
18060 30 2c 20 7a 54 65 6d 70 54 72 69 67 2c 20 50 33  0, zTempTrig, P3
18070 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
18080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
18090 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70 54 72  liteFree(zTempTr
180a0 69 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ig);.#endif.  }.
180b0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
180c0 61 6d 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a     ame);.}.#endif.