/ Hex Artifact Content
Login

Artifact 74653e045581bfbadb8b35a0cb38a62f4a2c850e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 35 30 20 32 30 30 35 2f 30 39 2f 31 36  1.350 2005/09/16
02f0: 20 30 32 3a 34 38 3a 30 32 20 64 72 68 20 45 78   02:48:02 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
05e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0600: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0610: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0620: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0630: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0650: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0660: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0670: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0680: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0690: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
06a0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
06b0: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
06c0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
06d0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
06e0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
06f0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0700: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0710: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
0720: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
0730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0740: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
0750: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
0760: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
0770: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0780: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0790: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
07a0: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
07b0: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
07c0: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
07d0: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
07e0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
07f0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
0800: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0810: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
0820: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
0830: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
0840: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
0850: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
0860: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
0870: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0880: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0890: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
08a0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
08b0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
08c0: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
08d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
08e0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
08f0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0900: 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  to-1, sqlite3Vdb
0910: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
0920: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
0930: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
0940: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
0950: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
0960: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
0970: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
0980: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
0990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
09a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
09b0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
09c0: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
09d0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
09e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
09f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0a00: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
0a10: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
0a20: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
0a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
0a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0a50: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
0a60: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
0a70: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
0a80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
0a90: 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20  CE.    /* Add a 
0aa0: 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61  No-op that conta
0ab0: 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ins the complete
0ac0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d   text of the com
0ad0: 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a  piled SQL.    **
0ae0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
0af0: 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20  s P3 argument.  
0b00: 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68  This does not ch
0b10: 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f  ange the functio
0b20: 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66  nality.    ** of
0b30: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20   the program. . 
0b40: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
0b50: 73 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  s is used to imp
0b60: 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74  lement sqlite3_t
0b70: 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  race()..    */. 
0b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
0b90: 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  3(v, OP_Noop, 0,
0ba0: 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c   0, pParse->zSql
0bb0: 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d  , pParse->zTail-
0bc0: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 23  pParse->zSql);.#
0bd0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0be0: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20  OMIT_TRACE */.  
0bf0: 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  }...  /* Get the
0c00: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
0c10: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
0c20: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
0c30: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
0c40: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
0c50: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
0c60: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
0c70: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
0c80: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
0c90: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0ca0: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0cb0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0cc0: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0cd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c   pParse->nMem+3,
0ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0cf0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
0d00: 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65  ->nTab+3, pParse
0d10: 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  ->explain);.    
0d20: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
0d30: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50  ITE_DONE;.    pP
0d40: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
0d50: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
0d60: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
0d70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0d80: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
0d90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
0da0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
0db0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
0dc0: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
0dd0: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
0de0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
0df0: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
0e00: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  ask = 0;.  pPars
0e10: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
0e20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
0e30: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63  the parser and c
0e40: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65  ode generator re
0e50: 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64  cursively in ord
0e60: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a  er to generate.*
0e70: 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  * code for the S
0e80: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  QL statement giv
0e90: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  en onto the end 
0ea0: 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f  of the pParse co
0eb0: 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74  ntext.** current
0ec0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
0ed0: 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65  ction.  When the
0ee0: 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72   parser is run r
0ef0: 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68  ecursively.** th
0f00: 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61  is way, the fina
0f10: 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74  l OP_Halt is not
0f20: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74   appended and ot
0f30: 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  her initializati
0f40: 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69  on.** and finali
0f50: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65  zation steps are
0f60: 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65   omitted because
0f70: 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c   those are handl
0f80: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75  ing by the.** ou
0f90: 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a  termost parser..
0fa0: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74  **.** Not everyt
0fb0: 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65  hing is nestable
0fc0: 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79  .  This facility
0fd0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
0fe0: 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54  permit.** INSERT
0ff0: 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45  , UPDATE, and DE
1000: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
1010: 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d  against SQLITE_M
1020: 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63  ASTER.  Use.** c
1030: 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64  are if you decid
1040: 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20  e to try to use 
1050: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72  this routine for
1060: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1070: 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oses..*/.void sq
1080: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1090: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
10b0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
10c0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
10d0: 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20  *zSql;.# define 
10e0: 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66  SAVE_SZ  (sizeof
10f0: 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74  (Parse) - offset
1100: 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a  of(Parse,nVar)).
1110: 20 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53    char saveBuf[S
1120: 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20  AVE_SZ];..  if( 
1130: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
1140: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
1150: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c   pParse->nested<
1160: 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e  10 );  /* Nestin
1170: 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  g should only be
1180: 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74   of limited dept
1190: 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28  h */.  va_start(
11a0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
11b0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d  zSql = sqlite3VM
11c0: 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  Printf(zFormat, 
11d0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
11e0: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
11f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1200: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1210: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1220: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1230: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1240: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1250: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1260: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1270: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1280: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1290: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
12a0: 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  rse, zSql, 0);. 
12b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c   sqliteFree(zSql
12c0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
12d0: 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42  rse->nVar, saveB
12e0: 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  uf, SAVE_SZ);.  
12f0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d  pParse->nested--
1300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
1310: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1320: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1330: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
1340: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
1350: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
1360: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
1370: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
1380: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
1390: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
13a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
13b0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
13c0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
13d0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
13e0: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
13f0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
1400: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74  arched for the t
1410: 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  able and the.** 
1420: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74  first matching t
1430: 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  able is returned
1440: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .  (No checking 
1450: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61  for duplicate ta
1460: 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20  ble.** names is 
1470: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
1480: 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50  ch order is TEMP
1490: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
14a0: 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61  N, then any.** a
14b0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
14c0: 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74  es added using t
14d0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
14e0: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
14f0: 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  o sqlite3LocateT
1500: 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65  able()..*/.Table
1510: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62   *sqlite3FindTab
1520: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
1530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1540: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1550: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62  Database){.  Tab
1560: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  le *p = 0;.  int
1570: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e   i;.  assert( zN
1580: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ame!=0 );.  asse
1590: 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  rt( (db->flags &
15a0: 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69   SQLITE_Initiali
15b0: 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  zed) || db->init
15c0: 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69  .busy );.  for(i
15d0: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
15e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
15f0: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
1600: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
1610: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
1620: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
1630: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
1640: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1650: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
1660: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
1670: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1680: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
1690: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
16a0: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
16b0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
16c0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
16d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
16e0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
16f0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1700: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1710: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1720: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1730: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1740: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1750: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1760: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1770: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1780: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1790: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
17a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
17b0: 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76  ound.  Also leav
17c0: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  e an.** error me
17d0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
17e0: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
17f0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1800: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
1810: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
1820: 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68  indTable() is th
1830: 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  at this.** routi
1840: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
1850: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
1860: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68  arse->zErrMsg wh
1870: 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69  ere.** sqlite3Fi
1880: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1890: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
18a0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
18b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
18d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
18e0: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
18f0: 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  *p;..  /* Read t
1900: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1910: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
1920: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
1930: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1940: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
1950: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
1960: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
1970: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1980: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1990: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
19a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20  urn 0;.  }..  p 
19b0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
19c0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
19d0: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
19e0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
19f0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
1a00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1a20: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e   such table: %s.
1a30: 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  %s", zDbase, zNa
1a40: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
1a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1a60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1a70: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1a80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
1a90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
1aa0: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1ab0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1ac0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1ad0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1ae0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1af0: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
1b00: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
1b10: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1b20: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
1b30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1b40: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
1b50: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
1b60: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
1b70: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1b80: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
1b90: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
1ba0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
1bb0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
1bc0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
1bd0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
1be0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
1bf0: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
1c00: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
1c10: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
1c20: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
1c30: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
1c40: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
1c50: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
1c60: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
1c70: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
1c80: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
1c90: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
1ca0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
1cb0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1cc0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
1cd0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
1ce0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
1cf0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1d00: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
1d10: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
1d20: 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  d) || db->init.b
1d30: 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  usy );.  for(i=O
1d40: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
1d50: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1d60: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
1d70: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
1d80: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
1d90: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
1da0: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
1db0: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
1dc0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
1dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
1de0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1df0: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64  d(&db->aDb[j].id
1e00: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
1e10: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1e20: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1e30: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1e40: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
1e50: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
1e60: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
1e70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e80: 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  reeIndex(Index *
1e90: 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p){.  sqliteFree
1ea0: 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  (p->zColAff);.  
1eb0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
1ec0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
1ed0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
1ee0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
1ef0: 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72  sh table, and fr
1f00: 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79  ee.** its memory
1f10: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a   structures..**.
1f20: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  ** The index is 
1f30: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1f40: 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74   database hash t
1f50: 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20  ables but.** it 
1f60: 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20  is not unlinked 
1f70: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74  from the Table t
1f80: 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a  hat it indexes..
1f90: 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f  ** Unlinking fro
1fa0: 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74  m the Table must
1fb0: 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20   be done by the 
1fc0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fe0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
1ff0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2000: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64  Index *p){.  Ind
2010: 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73  ex *pOld;..  ass
2020: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
2030: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
2040: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
2050: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
2060: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
2070: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e        strlen(p->
20a0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
20b0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
20c0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
20d0: 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a  freeIndex(p);.}.
20e0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
20f0: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
2100: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
2110: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
2120: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
2130: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
2140: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
2150: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
2160: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
2170: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
2180: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
2190: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
21a0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
21b0: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
21c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
21d0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
21e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
21f0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
2200: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
2210: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
2220: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c 65 6e   int len;..  len
2230: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61   = strlen(zIdxNa
2240: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  me);.  pIndex = 
2250: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2260: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
2270: 69 64 78 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  idxHash, zIdxNam
2280: 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20  e, len+1, 0);.  
2290: 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
22a0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
22b0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
22c0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
22d0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
22e0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
22f0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
2300: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
2310: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e  .      for(p=pIn
2320: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2330: 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65  dex; p && p->pNe
2340: 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d  xt!=pIndex; p=p-
2350: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  >pNext){}.      
2360: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  if( p && p->pNex
2370: 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  t==pIndex ){.   
2380: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
2390: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
23a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23b0: 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
23c0: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  x);.  }.  db->fl
23d0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
23e0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
23f0: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2400: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
2410: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d  on from the in-m
2420: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
2430: 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  s of.** a single
2440: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
2450: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2460: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
2470: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
2480: 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73  he database clos
2490: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
24a0: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
24b0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
24c0: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
24d0: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
24e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
24f0: 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d  or if a.** schem
2500: 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63  a-cookie mismatc
2510: 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  h occurs..**.** 
2520: 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72  If iDb<=0 then r
2530: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2540: 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  l schema tables 
2550: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
2560: 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69  .** files.  If i
2570: 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74  Db>=2 then reset
2580: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
2590: 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68  hema for only th
25a0: 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65  e.** single file
25b0: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76   indicated..*/.v
25c0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
25d0: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73  InternalSchema(s
25e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
25f0: 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iDb){.  HashElem
2600: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
2610: 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65  temp1;.  Hash te
2620: 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  mp2;.  int i, j;
2630: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
2640: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
2650: 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  b );.  db->flags
2660: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74   &= ~SQLITE_Init
2670: 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69  ialized;.  for(i
2680: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
2690: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
26a0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
26b0: 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44  ;.    temp1 = pD
26c0: 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20  b->tblHash;.    
26d0: 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69  temp2 = pDb->tri
26e0: 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74  gHash;.    sqlit
26f0: 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  e3HashInit(&pDb-
2700: 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54  >trigHash, SQLIT
2710: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
2730: 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46  shClear(&pDb->aF
2740: 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
2750: 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d  3HashClear(&pDb-
2760: 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66  >idxHash);.    f
2770: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2780: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29  ashFirst(&temp2)
2790: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
27a0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
27b0: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 73 71 6c  lem)){.      sql
27c0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
27d0: 72 28 28 54 72 69 67 67 65 72 2a 29 73 71 6c 69  r((Trigger*)sqli
27e0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
27f0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
2800: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2810: 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69  temp2);.    sqli
2820: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
2830: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
2840: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2850: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
2860: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2870: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
2880: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2890: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
28a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
28b0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
28c0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
28d0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
28e0: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
28f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2900: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29  ashClear(&temp1)
2910: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 53 65 71 54  ;.    pDb->pSeqT
2920: 61 62 20 3d 20 30 3b 0a 20 20 20 20 44 62 43 6c  ab = 0;.    DbCl
2930: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
2940: 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  i, DB_SchemaLoad
2950: 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  ed);.    if( iDb
2960: 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  >0 ) return;.  }
2970: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
2980: 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  0 );.  db->flags
2990: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
29a0: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a  rnChanges;..  /*
29b0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
29c0: 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  of the auxiliary
29d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
29e0: 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  has been closed,
29f0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  .  ** then remov
2a00: 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20  e then from the 
2a10: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2a20: 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b  se list.  We tak
2a30: 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72  e the.  ** oppor
2a40: 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69  tunity to do thi
2a50: 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20  s here since we 
2a60: 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65  have just delete
2a70: 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a  d all of the.  *
2a80: 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61  * schema hash ta
2a90: 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f  bles and therefo
2aa0: 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  re do not have t
2ab0: 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  o make any chang
2ac0: 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f  es.  ** to any o
2ad0: 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  f those tables..
2ae0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2af0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2b00: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
2b10: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
2b20: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
2b30: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
2b40: 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26  if( pDb->pAux &&
2b50: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29   pDb->xFreeAux )
2b60: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70   pDb->xFreeAux(p
2b70: 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  Db->pAux);.     
2b80: 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a   pDb->pAux = 0;.
2b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
2ba0: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
2bb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2bc0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2bd0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2be0: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
2c00: 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  e(pDb->zName);. 
2c10: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
2c20: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
2c30: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
2c40: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
2c50: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
2c60: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
2c70: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
2c80: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
2c90: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
2ca0: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
2cb0: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
2cc0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
2cd0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
2ce0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
2cf0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
2d00: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
2d10: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
2d20: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
2d30: 20 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e   sqliteFree(db->
2d40: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
2d50: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
2d60: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
2d70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2d80: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
2d90: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
2da0: 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  s.  If there wer
2db0: 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e  e.** schema chan
2dc0: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
2dd0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
2de0: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65   we have to rese
2df0: 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61  t the.** interna
2e00: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  l hash tables an
2e10: 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72  d reload them fr
2e20: 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64  om disk..*/.void
2e30: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
2e40: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2e50: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2e60: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
2e70: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2e80: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
2e90: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2ea0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
2eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2ec0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2ed0: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
2ee0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
2ef0: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
2f00: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2f10: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
2f20: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2f30: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
2f50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
2f60: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f  s from a table o
2f70: 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69  r view..*/.stati
2f80: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73  c void sqliteRes
2f90: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
2fa0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
2fb0: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
2fc0: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
2fd0: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
2fe0: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
2ff0: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
3000: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3010: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
3020: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
3030: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
3040: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3050: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3060: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
3070: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3080: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
3090: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
30a0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
30b0: 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  );.  }.  pTable-
30c0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
30d0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d  ble->nCol = 0;.}
30e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
30f0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
3100: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3110: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
3120: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
3130: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
3140: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
3150: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
3160: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
3170: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
3180: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
3190: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
31a0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
31b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
31c0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
31d0: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
31e0: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
31f0: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
3200: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
3210: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
3220: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
3230: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
3240: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
3250: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
3260: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
3270: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
3280: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
3290: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
32a0: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
32b0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
32c0: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
32d0: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
32e0: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
32f0: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
3300: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
3310: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
3320: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
3330: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
3340: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
3350: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
3360: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3370: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
3380: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3390: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
33a0: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
33b0: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
33c0: 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  ey;..  if( pTabl
33d0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  e==0 ) return;..
33e0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65    /* Do not dele
33f0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74  te the table unt
3400: 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  il the reference
3410: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
3420: 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65  ero. */.  pTable
3430: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
3440: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29  pTable->nRef>0 )
3450: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
3460: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
3470: 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
3480: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
3490: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
34a0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
34b0: 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  le.  */.  for(pI
34c0: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
34d0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
34e0: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
34f0: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
3500: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
3510: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62  ert( pIndex->iDb
3520: 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c  ==pTable->iDb ||
3530: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30   (pTable->iDb==0
3540: 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d   && pIndex->iDb=
3550: 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  =1) );.    sqlit
3560: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
3570: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23   pIndex);.  }..#
3580: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3590: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
35a0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66   /* Delete all f
35b0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
35c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
35d0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79   table.  The key
35e0: 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  s.  ** should ha
35f0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
3600: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
3610: 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68  e db->aFKey hash
3620: 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66   table .  */.  f
3630: 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d  or(pFKey=pTable-
3640: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
3650: 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b  FKey=pNextFKey){
3660: 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d  .    pNextFKey =
3670: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
3680: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
3690: 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e  Table->iDb<db->n
36a0: 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
36b0: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
36c0: 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c  d(&db->aDb[pTabl
36d0: 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20  e->iDb].aFKey,. 
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
3700: 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b  >zTo, strlen(pFK
3710: 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b  ey->zTo)+1)!=pFK
3720: 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
3730: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d  Free(pFKey);.  }
3740: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
3750: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
3760: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
3770: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65  .  */.  sqliteRe
3780: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
3790: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
37a0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
37b0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
37c0: 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  e(pTable->zColAf
37d0: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
37e0: 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  ectDelete(pTable
37f0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
3800: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
3810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
3820: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
3830: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3840: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
3850: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
3860: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
3870: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
3880: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
3890: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
38a0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
38b0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
38c0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
38d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
38e0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
38f0: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
3900: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
3910: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3920: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
3930: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
3940: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
3950: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
3960: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
3970: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3980: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
3990: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
39a0: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
39b0: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61  e, strlen(zTabNa
39c0: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
39d0: 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   p ){.#ifndef SQ
39e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
39f0: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
3a00: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
3a10: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
3a20: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
3a30: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
3a40: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
3a50: 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48    pF2 = sqlite3H
3a60: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46  ashFind(&pDb->aF
3a70: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
3a80: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
3a90: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
3aa0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
3ab0: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
3ac0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
3ad0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
3ae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3af0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
3b00: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
3b10: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
3b20: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
3b30: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
3b40: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
3b50: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
3b60: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
3b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
3b80: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
3b90: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3ba0: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
3bb0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3bc0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3bd0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
3be0: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
3bf0: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
3c00: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
3c10: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
3c20: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
3c30: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
3c40: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
3c50: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3c60: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
3c70: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3c80: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
3c90: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3ca0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
3cb0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
3cc0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
3cd0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
3ce0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
3cf0: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
3d00: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
3d10: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
3d20: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
3d30: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3d40: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
3d50: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
3d60: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
3d70: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
3d80: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
3d90: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
3da0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
3db0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
3dc0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
3dd0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
3df0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
3e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
3e10: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
3e20: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
3e30: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
3e40: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3e50: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
3e60: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
3e70: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
3e80: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
3e90: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
3ea0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3eb0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
3ec0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44  (Vdbe *v, int iD
3ed0: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
3ee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3ef0: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
3f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f10: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3f20: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
3f30: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
3f40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
3f50: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
3f60: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
3f70: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
3f80: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  s */.}../*.** Th
3f90: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
3fa0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
3fb0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
3fc0: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
3fd0: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
3fe0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
3ff0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
4000: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
4010: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
4020: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
4030: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
4040: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
4050: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
4060: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
4070: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
4080: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
4090: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
40a0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20  t i = -1;    /* 
40b0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
40c0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
40d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40e0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
40f0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20  he name */.  Db 
4100: 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41  *pDb;       /* A
4110: 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20   database whose 
4120: 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65  name space is be
4130: 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a  ing searched */.
4140: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
4150: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
4160: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
4170: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ..  zName = sqli
4180: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4190: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
41a0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20  Name ){.    n = 
41b0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
41c0: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
41d0: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
41e0: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
41f0: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
4200: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
4210: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
4220: 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e  ==strlen(pDb->zN
4230: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4240: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4250: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4260: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4280: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4290: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
42a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
42b0: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
42c0: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
42d0: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
42e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
42f0: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
4300: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
4310: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
4320: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
4330: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
4340: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
4350: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
4360: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
4370: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4380: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
4390: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
43a0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
43b0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
43c0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
43d0: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
43e0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
43f0: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
4400: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
4410: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
4420: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
4430: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
4440: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
4450: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
4460: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
4470: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
4480: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
4490: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
44a0: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
44b0: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
44c0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
44d0: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
44e0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
44f0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
4500: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4510: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4520: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4530: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
4540: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4550: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
4560: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
4570: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
4580: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
4590: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
45a0: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
45b0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
45c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
45d0: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
45e0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
45f0: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
4600: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
4610: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
4620: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4630: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
4640: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
4650: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4660: 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65  db;..  if( pName
4670: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  2 && pName2->n>0
4680: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4690: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
46a0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
46b0: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
46c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
46d0: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
46e0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
46f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4700: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
4710: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
4720: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
4730: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4740: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
4750: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
4760: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
4770: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
4780: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
4790: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
47a0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
47b0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
47c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
47d0: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
47e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
47f0: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
4800: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
4810: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
4820: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
4830: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
4840: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
4850: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
4860: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
4870: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
4880: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
4890: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
48a0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
48b0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
48c0: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
48d0: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
48e0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
48f0: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
4900: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4910: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
4920: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
4930: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
4940: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
4950: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
4960: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
4970: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
4980: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
4990: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
49a0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
49b0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
49c0: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
49d0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
49e0: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
49f0: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
4a00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4a10: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
4a20: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
4a30: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
4a40: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
4a50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4a60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
4a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
4a90: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
4aa0: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
4ab0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
4ac0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
4ad0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
4ae0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
4af0: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
4b00: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
4b10: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
4b20: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4b30: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
4b40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4b50: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
4b60: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
4b70: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
4b80: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
4b90: 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53  name.  The.** pS
4ba0: 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  tart token is th
4bb0: 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61  e CREATE and pNa
4bc0: 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  me is the table 
4bd0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d  name.  The isTem
4be0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
4bf0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
4c00: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
4c10: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
4c20: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
4c30: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
4c40: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4c50: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
4c60: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
4c70: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
4c80: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
4c90: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
4ca0: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
4cb0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
4cc0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
4cd0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
4ce0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
4cf0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
4d00: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
4d10: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
4d20: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4d30: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
4d40: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
4d50: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
4d60: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
4d70: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
4d80: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
4d90: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
4da0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
4db0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4dc0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
4dd0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
4de0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
4df0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
4e00: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
4e10: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
4e20: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4e30: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
4e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4e50: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4e60: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4e70: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
4e80: 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a  "CREATE" token *
4e90: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4ea0: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
4eb0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
4ec0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
4ed0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
4ee0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
4ef0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
4f00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
4f10: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
4f20: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
4f30: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
4f40: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
4f50: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20  */.  int isView 
4f60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4f70: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
4f80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
4f90: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
4fa0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
4fb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
4fc0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
4fd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4fe0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
4ff0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5000: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5010: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
5020: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
5030: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
5040: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
5050: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
5060: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
5070: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
5080: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
5090: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
50a0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
50b0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
50c0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
50d0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
50e0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
50f0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5100: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
5110: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5120: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5130: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
5140: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5150: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
5160: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
5170: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
5180: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5190: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
51a0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
51b0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
51c0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
51d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
51e0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
51f0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5200: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
5210: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
5220: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
5230: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
5240: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
5250: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
5260: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5270: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5280: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
5290: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
52a0: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
52b0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
52c0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
52d0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
52e0: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
52f0: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
5300: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
5310: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
5320: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
5330: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
5340: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
5350: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
5360: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
5370: 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a   iDb>1 ){.    /*
5380: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
5390: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
53a0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
53b0: 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  ualified */.    
53c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
53d0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
53e0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
53f0: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
5400: 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d");.    return;
5410: 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54  .  }.  if( !OMIT
5420: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5430: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
5440: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
5450: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
5460: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5470: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
5480: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
5490: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
54a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
54b0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
54c0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
54d0: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
54e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
54f0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  r;.  }.  if( db-
5500: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69  >init.iDb==1 ) i
5510: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64  sTemp = 1;.#ifnd
5520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5530: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61  UTHORIZATION.  a
5540: 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26  ssert( (isTemp &
5550: 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20   1)==isTemp );. 
5560: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
5570: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
5580: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
5590: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
55a0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
55b0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
55c0: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
55d0: 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
55e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
55f0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5600: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
5610: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
5620: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5630: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
5640: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5650: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5660: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
5670: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
5680: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5690: 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  E_VIEW;.      }.
56a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56b0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
56c0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
56d0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
56e0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
56f0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
5700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
5710: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5720: 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  E_TABLE;.      }
5730: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
5740: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
5750: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
5760: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
5770: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
5780: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5790: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
57a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
57b0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
57c0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
57d0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
57e0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
57f0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
5800: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
5810: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
5820: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
5830: 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f  ** it does..  */
5840: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
5850: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
5860: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
5870: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5880: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5890: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
58a0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
58b0: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
58c0: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b].zName);.  if(
58d0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73   pTable ){.    s
58e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
58f0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
5900: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
5910: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  , pName);.    go
5920: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5930: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5940: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
5950: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
5960: 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20  0 && (iDb==0 || 
5970: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
5980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5990: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
59a0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
59b0: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
59c0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
59d0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
59e0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
59f0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61  Table = sqliteMa
5a00: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
5a10: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
5a20: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ble==0 ){.    pP
5a30: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
5a40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
5a50: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5a60: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5a70: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
5a80: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
5a90: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
5aa0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
5ab0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
5ac0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
5ad0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
5ae0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
5af0: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
5b00: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
5b10: 31 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  1;.  if( pParse-
5b20: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
5b30: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
5b40: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
5b50: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
5b60: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
5b70: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
5b80: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
5b90: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
5ba0: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
5bb0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
5bc0: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
5bd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
5be0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
5bf0: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
5c00: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
5c10: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
5c20: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
5c30: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
5c40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5c50: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
5c60: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
5c70: 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d  d && strcmp(zNam
5c80: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
5c90: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
5ca0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65  db->aDb[iDb].pSe
5cb0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
5cc0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5cd0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
5ce0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
5cf0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
5d00: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
5d10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
5d20: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
5d30: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
5d40: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
5d50: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
5d60: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
5d70: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
5d80: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
5d90: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
5da0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
5db0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
5dc0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
5dd0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
5de0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
5df0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
5e00: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
5e10: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
5e20: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
5e30: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
5e40: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
5e50: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5e60: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
5e70: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
5e80: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
5e90: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
5ea0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
5eb0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
5ec0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c  0 ){.    int lbl
5ed0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
5ee0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
5ef0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
5f00: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
5f10: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
5f20: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
5f30: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
5f40: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
5f50: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
5f60: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  w..    */.    sq
5f70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5f80: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
5f90: 20 69 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66   iDb, 1);   /* f
5fa0: 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile_format */.  
5fb0: 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56    lbl = sqlite3V
5fc0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5fe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
5ff0: 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c  0, lbl);.    sql
6000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6010: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6020: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
6030: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6040: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
6050: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
6060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6070: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6080: 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29  ger, db->enc, 0)
6090: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
60a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
60b0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b  Cookie, iDb, 4);
60c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60d0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
60e0: 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  lbl);..    /* Th
60f0: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
6100: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
6110: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
6120: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
6130: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
6140: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
6150: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
6160: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
6170: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
6180: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
6190: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
61a0: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
61b0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
61c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
61d0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
61e0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
61f0: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
6200: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6210: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c  ** The rowid val
6220: 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  ue is needed by 
6230: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  the code that sq
6240: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
6250: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
6260: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  te..    */.#ifnd
6270: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6280: 49 45 57 0a 20 20 20 20 69 66 28 20 69 73 56 69  IEW.    if( isVi
6290: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
62a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
62b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
62c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
62d0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
62e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62f0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6300: 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  le, iDb, 0);.   
6310: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
6320: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
6330: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
6340: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6350: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 30  P_NewRowid, 0, 0
6360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6370: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
6380: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
6390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
63a0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
63b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
63d0: 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ert, 0, 0);.    
63e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
63f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6400: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6410: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6420: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Pull, 1, 0);.  }
6430: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
6440: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
6450: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
6460: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
6470: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
6480: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
6490: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
64a0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
64b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
64c0: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
64d0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
64e0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
64f0: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
6500: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
6510: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
6520: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
6530: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
6540: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
6550: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
6560: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
6570: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
6580: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
6590: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
65a0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
65b0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
65c0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
65d0: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
65e0: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
65f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
6600: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
6610: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
6620: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
6630: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
6640: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
6650: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
6660: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
6670: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6680: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
6690: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
66a0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
66b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
66c0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
66d0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
66e0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
66f0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
6700: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
6710: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
6720: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6730: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
6740: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
6750: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
6760: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
6770: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
6780: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6790: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
67a0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
67b0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
67c0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
67d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
67e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
67f0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
6800: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6810: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6820: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6830: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
6840: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6850: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
6860: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6870: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
6880: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
6890: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
68a0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
68b0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
68c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
68d0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
68e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
68f0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
6900: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
6910: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6920: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
6930: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
6940: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
6950: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
6960: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
6970: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
6980: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
6990: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
69a0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
69b0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
69c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
69d0: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
69e0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
69f0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
6a00: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
6a10: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
6a20: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6a30: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
6a40: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
6a50: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
6a60: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
6a70: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
6a80: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
6a90: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
6aa0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
6ab0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
6ac0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
6ad0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
6ae0: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
6af0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
6b00: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
6b10: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6b20: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
6b30: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
6b40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
6b50: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
6b60: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
6b70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6b80: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
6b90: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
6ba0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
6bb0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
6bc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6bd0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
6be0: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
6bf0: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
6c00: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
6c10: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6c20: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6c30: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6c40: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6c50: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6c60: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
6c70: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
6c80: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
6c90: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6ca0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
6cb0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6cc0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6cd0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6ce0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
6cf0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
6d00: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
6d10: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
6d20: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
6d30: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
6d40: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
6d50: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
6d60: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
6d70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6d80: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
6d90: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
6da0: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
6db0: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
6dc0: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
6dd0: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
6de0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
6df0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
6e00: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
6e10: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
6e20: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
6e30: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
6e40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
6e50: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
6e60: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
6e70: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
6e80: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
6e90: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
6ea0: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
6eb0: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
6ec0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
6ed0: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
6ee0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
6ef0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
6f00: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
6f30: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
6f40: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
6f50: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
6f60: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
6f70: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
6f80: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
6f90: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
6fa0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
6fb0: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
6fc0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
6fd0: 4f 4e 45 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  ONE.**.** If non
6fe0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
6ff0: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
7000: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
7010: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
7020: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
7030: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
7040: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
7050: 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54  (const Token *pT
7060: 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  ype){.  u32 h = 
7070: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
7080: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7090: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  IC;.  const unsi
70a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d  gned char *zIn =
70b0: 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e   pType->z;.  con
70c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
70d0: 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70 65 2d   *zEnd = &pType-
70e0: 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20  >z[pType->n];.. 
70f0: 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e   while( zIn!=zEn
7100: 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  d ){.    h = (h<
7110: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
7120: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b  erToLower[*zIn];
7130: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
7140: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7150: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
7160: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
7170: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
7180: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7190: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
71a0: 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20   .    }else if( 
71b0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
71c0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
71d0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
71e0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
71f0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7200: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7210: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
7220: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
7230: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
7240: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
7250: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7260: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
7270: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7280: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
7290: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
72a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
72b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
72c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
72d0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
72e0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
72f0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65  _NONE;.    }else
7300: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7310: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7320: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7330: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7340: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7350: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 20 0a 20  _AFF_INTEGER; . 
7360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7370: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
7380: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
7390: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
73a0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
73b0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
73c0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
73d0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
73e0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
73f0: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
7400: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
7410: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
7420: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
7430: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
7440: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
7450: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
7460: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
7470: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
7480: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
7490: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
74a0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
74b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
74c0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
74d0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
74e0: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
74f0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
7500: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
7510: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
7520: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
7530: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
7540: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
7550: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
7560: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7570: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
7580: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
7590: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
75a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
75b0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
75c0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
75d0: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
75e0: 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65  Col[i];.  sqlite
75f0: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
7600: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
7610: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7620: 6f 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a  omToken(pType);.
7630: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
7640: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
7650: 74 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d  tyType(pType);.}
7660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
7670: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
7680: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
7690: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
76a0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
76b0: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
76c0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
76d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
76e0: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
76f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
7700: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
7710: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
7720: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
7730: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
7740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7750: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
7760: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
7770: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
7780: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
7790: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
77a0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
77b0: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
77c0: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
77d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
77e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
77f0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
7800: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7810: 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29  >pNewTable)!=0 )
7820: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
7830: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
7840: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
7850: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
7860: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78  ntOrFunction(pEx
7870: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
7880: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7890: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
78a0: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
78b0: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
78c0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
78d0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
78e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
78f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7900: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
7910: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
7920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7930: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  (pExpr);.    }. 
7940: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
7950: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d  Delete(pExpr);.}
7960: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
7970: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
7980: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
7990: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
79a0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
79b0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
79c0: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
79d0: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
79e0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
79f0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
7a00: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
7a10: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
7a20: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
7a30: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
7a40: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
7a50: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
7a60: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
7a70: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
7a80: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
7a90: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
7aa0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
7ab0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
7ac0: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
7ad0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
7ae0: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
7af0: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
7b00: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
7b10: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
7b20: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
7b30: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
7b40: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
7b50: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
7b60: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
7b70: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
7b80: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
7b90: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
7ba0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7bb0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
7bc0: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
7bd0: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
7be0: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
7bf0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
7c00: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
7c10: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
7c20: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
7c30: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
7c40: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
7c50: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
7c60: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
7c70: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
7c80: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
7c90: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
7ca0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
7cb0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
7cc0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
7cd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7ce0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
7cf0: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
7d00: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
7d10: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
7d20: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
7d30: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
7d40: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
7d50: 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20 2f   autoInc       /
7d60: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
7d70: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
7d80: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
7d90: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
7da0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
7db0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
7dc0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
7dd0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
7de0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
7df0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
7e00: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
7e10: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
7e20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7e30: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
7e40: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
7e50: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
7e60: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
7e70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
7e80: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
7e90: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
7ea0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
7eb0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
7ec0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
7ed0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
7ee0: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
7ef0: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
7f00: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
7f10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7f20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7f30: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
7f40: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
7f50: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
7f60: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7f70: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
7f80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
7f90: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
7fa0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
7fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7fd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
7fe0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
7ff0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
8000: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
8010: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8020: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
8030: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
8040: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
8050: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
8060: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
8070: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
8080: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
8090: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
80a0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
80b0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
80c0: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
80d0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
80e0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
80f0: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
8100: 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e      pTab->autoIn
8110: 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d  c = autoInc;.  }
8120: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
8130: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
8140: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
8150: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
8160: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8170: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
8180: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
8190: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
81a0: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
81b0: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
81c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
81d0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
81e0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
81f0: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
8200: 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  0, 0);.    pList
8210: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
8220: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
8230: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8240: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
8250: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
8260: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
8270: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
8280: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8290: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
82a0: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
82b0: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
82c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
82d0: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
82e0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
82f0: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
8300: 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65   nType){.  Table
8310: 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49   *p;.  Index *pI
8320: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
8330: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Coll;.  int i;..
8340: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8350: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
8360: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
8370: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70   p->nCol-1;..  p
8380: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
8390: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
83a0: 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  se, zType, nType
83b0: 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  );.  p->aCol[i].
83c0: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a  pColl = pColl;..
83d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
83e0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
83f0: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
8400: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
8410: 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e  ype>",.  ** then
8420: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
8430: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
8440: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
8450: 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  efore the.  ** c
8460: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
8470: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
8480: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
8490: 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  he case..  */.  
84a0: 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49  for(pIdx = p->pI
84b0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
84c0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
84d0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
84e0: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
84f0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
8500: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49  olumn[0]==i ) pI
8510: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
8520: 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[0] = pColl;.  
8530: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  }.}../*.** Call 
8540: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
8550: 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f  Seq() for all co
8560: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8570: 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  s in an index,.*
8580: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65  * in order to ve
8590: 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 74 68  rify that all th
85a0: 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6c 6c  e necessary coll
85b0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
85c0: 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a  are.** loaded..*
85d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
85e0: 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50  ckIndexCollSeq(P
85f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
8600: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66  dex *pIdx){.  if
8610: 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e  ( pIdx ){.    in
8620: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
8630: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
8640: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
8650: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
8660: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8670: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
8680: 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  ll[i]) ){.      
8690: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
86a0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
86b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
86c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
86d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
86e0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
86f0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8700: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
8710: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
8720: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
8730: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
8740: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
8750: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
8760: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
8770: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8780: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
8790: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
87a0: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
87b0: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
87c0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
87d0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
87e0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
87f0: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
8800: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
8810: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
8820: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
8830: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
8840: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
8850: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
8860: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
8870: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
8880: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
8890: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
88a0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
88b0: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
88c0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
88d0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
88e0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
88f0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
8900: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
8910: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
8920: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
8930: 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  se..*/.CollSeq *
8940: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
8950: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
8960: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
8970: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
8980: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8990: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
89a0: 20 75 38 20 65 6e 63 20 3d 20 64 62 2d 3e 65 6e   u8 enc = db->en
89b0: 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  c;.  u8 initbusy
89c0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
89d0: 3b 0a 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ;..  CollSeq *pC
89e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
89f0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
8a00: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
8a10: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
8a20: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
8a30: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
8a40: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
8a50: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
8a60: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c  CollSeq(db, pCol
8a70: 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  l, zName, nName)
8a80: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
8a90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e   ){.      if( nN
8aa0: 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ame<0 ){.       
8ab0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
8ac0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
8ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8ae0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
8af0: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
8b00: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
8b10: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  , nName, zName);
8b20: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  .      pColl = 0
8b30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
8b40: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
8b50: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8b60: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
8b70: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
8b80: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
8b90: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
8ba0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
8bb0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
8bc0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
8bd0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
8be0: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
8bf0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
8c00: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
8c10: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
8c20: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
8c30: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
8c40: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
8c50: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
8c60: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
8c70: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
8c80: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
8c90: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
8ca0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
8cb0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
8cc0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
8cd0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
8ce0: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
8cf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
8d00: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
8d10: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
8d20: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
8d30: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
8d40: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
8d50: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
8d60: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
8d70: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
8d80: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
8d90: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
8da0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
8db0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
8dc0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
8dd0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
8de0: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
8df0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
8e00: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
8e10: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
8e20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
8e30: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
8e40: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c  e3 *db, Vdbe *v,
8e50: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
8e60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8e70: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
8e80: 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
8e90: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20  _cookie+1, 0);. 
8ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8eb0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
8ec0: 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f  e, iDb, 0);.}../
8ed0: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
8ee0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
8ef0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
8f00: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
8f10: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
8f20: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
8f30: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
8f40: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
8f50: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
8f60: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
8f70: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
8f80: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
8f90: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
8fa0: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
8fb0: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
8fc0: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
8fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8fe0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
8ff0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
9000: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
9010: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
9020: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
9030: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
9040: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
9050: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69  /*.** Write an i
9060: 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74  dentifier onto t
9070: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69  he end of the gi
9080: 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64  ven string.  Add
9090: 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63  .** quote charac
90a0: 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a  ters as needed..
90b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
90c0: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
90d0: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
90e0: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
90f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9100: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
9110: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
9120: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
9130: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
9140: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
9150: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
9160: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
9170: 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74   !isalnum(zIdent
9180: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
9190: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
91a0: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
91b0: 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20  =  zIdent[j]!=0 
91c0: 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e  || isdigit(zIden
91d0: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
91e0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
91f0: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
9200: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b  dent, j)!=TK_ID;
9210: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9220: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9230: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
9240: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
9250: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
9260: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
9270: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
9280: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
9290: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
92a0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
92b0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
92c0: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
92d0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
92e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
92f0: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
9300: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
9310: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
9320: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
9330: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
9340: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
9350: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
9360: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
9370: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
9380: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
9390: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
93a0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
93b0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
93c0: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
93d0: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
93e0: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
93f0: 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75  zEnd, *z;.  Colu
9400: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
9410: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
9420: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
9430: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
9440: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
9450: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
9460: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  ->zName);.    z 
9470: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
9480: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
9490: 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a    n += (strlen(z
94a0: 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ) + 1);.    }.  
94b0: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
94c0: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
94d0: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20    if( n<50 ){.  
94e0: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
94f0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
9500: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
9510: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
9520: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
9530: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
9540: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
9550: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
9560: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
9570: 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
9580: 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66  ocRaw( n );.  if
9590: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
95a0: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
95b0: 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d  zStmt, !OMIT_TEM
95c0: 50 44 42 26 26 70 2d 3e 69 44 62 3d 3d 31 20 3f  PDB&&p->iDb==1 ?
95d0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
95e0: 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54 41  BLE ":"CREATE TA
95f0: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
9600: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
9610: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
9620: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
9630: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
9640: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
9650: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
9660: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
9670: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
9680: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
9690: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
96a0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
96b0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
96c0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
96d0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
96e0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
96f0: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
9700: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
9710: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
9720: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
9730: 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b  [k], z);.      k
9740: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20   += strlen(z);. 
9750: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70     }.  }.  strcp
9760: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
9770: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
9780: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
9790: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
97a0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
97b0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
97c0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
97d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
97e0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
97f0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
9800: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
9810: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
9820: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
9830: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
9840: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
9850: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
9860: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
9870: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
9880: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
9890: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
98a0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
98b0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
98c0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
98d0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
98e0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
98f0: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
9900: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
9910: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
9920: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9930: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9940: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
9950: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
9960: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9970: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
9980: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9990: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
99a0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
99b0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
99c0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
99d0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
99e0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
99f0: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
9a00: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
9a10: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
9a20: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
9a30: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
9a40: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
9a50: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
9a60: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
9a70: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
9a80: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
9a90: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
9aa0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
9ab0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
9ac0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
9ad0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
9ae0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
9af0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
9b00: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
9b10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9b20: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
9b30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9b40: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
9b50: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
9b60: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
9b70: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
9b80: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
9b90: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
9ba0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9bc0: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
9bd0: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
9be0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
9bf0: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
9c00: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
9c10: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
9c20: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
9c30: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9c40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9c50: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
9c60: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
9c70: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
9c80: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
9c90: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
9ca0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  d ) return;.  p 
9cb0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9cc0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9cd0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
9ce0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
9cf0: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
9d00: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9d10: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
9d20: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
9d30: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
9d40: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
9d50: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
9d60: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
9d70: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
9d80: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
9d90: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
9da0: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
9db0: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
9dc0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
9dd0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
9de0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
9df0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
9e00: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
9e10: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
9e20: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
9e30: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
9e40: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
9e50: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
9e60: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
9e70: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
9e80: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
9e90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
9ea0: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
9eb0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
9ec0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
9ed0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
9ee0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
9ef0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
9f00: 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63  tabase.  The rec
9f10: 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ord number.  ** 
9f20: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
9f30: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61  e entry should a
9f40: 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65  lready be on the
9f50: 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
9f60: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
9f70: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
9f80: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
9f90: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
9fa0: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
9fb0: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
9fc0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
9fd0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
9fe0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
9ff0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
a000: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
a010: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
a020: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
a030: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
a040: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
a050: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
a060: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
a070: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
a080: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
a090: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
a0a0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
a0b0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
a0c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a0d0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
a0e0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
a0f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a100: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
a110: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
a120: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
a130: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e  the new table an
a140: 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74  d push it onto t
a150: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
a160: 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72   A view has no r
a170: 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74  ootpage, so just
a180: 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74   push a zero ont
a190: 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a  o the stack for.
a1a0: 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49      ** views.  I
a1b0: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
a1c0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
a1d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a1e0: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
a1f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
a200: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
a210: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
a220: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
a230: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
a240: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a250: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
a260: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
a270: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
a280: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
a290: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
a2a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
a2b0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
a2c0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a2d0: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
a2e0: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
a2f0: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
a300: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
a310: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
a320: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
a330: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
a340: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
a350: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
a360: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
a370: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
a380: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
a390: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
a3a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
a3b0: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
a3c0: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
a3d0: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
a3e0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
a3f0: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
a400: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
a410: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
a420: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
a430: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61  lect ){.      Ta
a440: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
a450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a460: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a470: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a490: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
a4a0: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
a4b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a4c0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
a4d0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
a4e0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
a4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
a500: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
a510: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
a520: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
a530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a540: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a550: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
a560: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
a570: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
a580: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
a590: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
a5a0: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
a5b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
a5c0: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
a5d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a5e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
a5f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
a600: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
a610: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
a620: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
a630: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
a640: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
a650: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
a660: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
a670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
a680: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
a690: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
a6a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
a6b0: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
a6c0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
a6d0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
a6e0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
a6f0: 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
a700: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
a710: 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  mt(p);.    }else
a720: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64  {.      n = pEnd
a730: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
a740: 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a  ameToken.z + 1;.
a750: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
a760: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52  lite3MPrintf("CR
a770: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
a780: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
a790: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
a7a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
a7b0: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
a7c0: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
a7d0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
a7e0: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
a7f0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
a800: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
a810: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
a820: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
a830: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
a840: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
a850: 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69  ected.  The rowi
a860: 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c  d for the preall
a870: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c  ocated.    ** sl
a880: 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74  ot is the 2nd it
a890: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
a8a0: 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65    The top of the
a8b0: 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20   stack is the.  
a8c0: 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66    ** root page f
a8d0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
a8e0: 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73   (or a 0 if this
a8f0: 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20   is a view)..   
a900: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
a910: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
a920: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
a930: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
a940: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
a950: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
a960: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
a970: 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  =#0, sql=%Q ".  
a980: 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
a990: 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d  d=#1",.      db-
a9a0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61  >aDb[p->iDb].zNa
a9b0: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
a9c0: 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20 20  (p->iDb),.      
a9d0: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
a9e0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
a9f0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74  zName,.      zSt
aa00: 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
aa10: 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b  liteFree(zStmt);
aa20: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
aa30: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
aa40: 70 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  p->iDb);..#ifnde
aa50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
aa60: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
aa70: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
aa80: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
aa90: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
aaa0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
aab0: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
aac0: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
aad0: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
aae0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
aaf0: 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20  autoInc ){.     
ab00: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
ab10: 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20  aDb[p->iDb];.   
ab20: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 65 71     if( pDb->pSeq
ab30: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
ab40: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
ab50: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
ab60: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
ab70: 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
ab80: 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
ab90: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
aba0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  b->zName.       
abb0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
abc0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
abd0: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
abe0: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
abf0: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
ac00: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
ac10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ac20: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
ac30: 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a 20  ma, p->iDb, 0,. 
ac40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
ac50: 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d  rintf("tbl_name=
ac60: 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c  '%q'",p->zName),
ac70: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
ac80: 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
ac90: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
aca0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
acb0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
acc0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
acd0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
ace0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
acf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
ad00: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79   *pOld;.    FKey
ad10: 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44 62   *pFKey; .    Db
ad20: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
ad30: 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f  [p->iDb];.    pO
ad40: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
ad50: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c  Insert(&pDb->tbl
ad60: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
ad70: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
ad80: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
ad90: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
ada0: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
adb0: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
adc0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
add0: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
ade0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
adf0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
ae00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
ae10: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28  IGN_KEY.    for(
ae20: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
ae30: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
ae40: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
ae50: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
ae60: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
ae70: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
ae80: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73  Key->pNextTo = s
ae90: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
aea0: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  pDb->aFKey, pFKe
aeb0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
aec0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
aed0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
aee0: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
aef0: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
af00: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
af10: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
af20: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
af30: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
af40: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
af50: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69  ternChanges;..#i
af60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af70: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
af80: 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
af90: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
afa0: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
afb0: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
afc0: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
afd0: 7a 3d 3d 30 20 29 20 70 43 6f 6e 73 20 3d 20 70  z==0 ) pCons = p
afe0: 45 6e 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  End;.      p->ad
aff0: 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
b000: 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20 2d 20 70 50  + (pCons->z - pP
b010: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
b020: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  .z);.    }.#endi
b030: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
b040: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
b050: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
b060: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
b070: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
b080: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
b090: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
b0a0: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
b0b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b0c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
b0d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b0e0: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
b0f0: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
b100: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
b110: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
b120: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
b130: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
b140: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
b150: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b160: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
b170: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
b180: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
b190: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
b1a0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
b1b0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
b1c0: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
b1d0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
b1e0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
b1f0: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
b200: 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f  isTemp         /
b210: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
b220: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29  PORARY view */.)
b230: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
b240: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75  int n;.  const u
b250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
b260: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
b270: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
b280: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a   Token *pName;..
b290: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
b2a0: 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
b2b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b2c0: 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
b2d0: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
b2e0: 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
b2f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
b300: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
b310: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b320: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
b330: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
b340: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
b350: 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20  , isTemp, 1);.  
b360: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b370: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
b380: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
b390: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b3a0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b3b0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
b3c0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
b3d0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
b3e0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
b3f0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
b400: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
b410: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
b420: 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c   p->iDb, "view",
b430: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
b440: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
b450: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
b460: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
b470: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b480: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
b490: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
b4a0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
b4b0: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
b4c0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
b4d0: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
b4e0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
b4f0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
b500: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
b510: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
b520: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
b530: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
b540: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
b550: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
b560: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
b570: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
b580: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
b590: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
b5a0: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
b5b0: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
b5c0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
b5d0: 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  tDup(pSelect);. 
b5e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b5f0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b600: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
b610: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
b620: 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65     sqlite3ViewGe
b630: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
b640: 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20  rse, p);.  }..  
b650: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
b660: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
b670: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
b680: 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
b690: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
b6a0: 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
b6b0: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
b6c0: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
b6d0: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
b6e0: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
b6f0: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
b700: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
b710: 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a   0;.  n = sEnd.z
b720: 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   - pBegin->z;.  
b730: 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  z = (const unsig
b740: 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e  ned char*)pBegin
b750: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
b760: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
b770: 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e  ' || isspace(z[n
b780: 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  -1])) ){ n--; }.
b790: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
b7a0: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
b7b0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
b7c0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
b7d0: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
b7e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
b7f0: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
b800: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
b810: 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
b820: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
b830: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b840: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
b850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b860: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
b870: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
b880: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
b890: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
b8a0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
b8b0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
b8c0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
b8d0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
b8e0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
b8f0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
b900: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
b910: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
b920: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b930: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
b940: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
b950: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
b960: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
b970: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
b980: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
b990: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
b9a0: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
b9b0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
b9c0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
b9d0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
b9e0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
b9f0: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
ba00: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
ba10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
ba20: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
ba30: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
ba40: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
ba50: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
ba60: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
ba70: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
ba80: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
ba90: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
baa0: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a   pTable );..  /*
bab0: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
bac0: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
bad0: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
bae0: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
baf0: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
bb00: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
bb10: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
bb20: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
bb30: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
bb40: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
bb50: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
bb60: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
bb70: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
bb80: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
bb90: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
bba0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
bbb0: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
bbc0: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
bbd0: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
bbe0: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
bbf0: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
bc00: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
bc10: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
bc20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
bc30: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
bc40: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
bc50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
bc60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
bc70: 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20  lly, this error 
bc80: 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f  is caught previo
bc90: 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20  usly and so the 
bca0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20  following test. 
bcb0: 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   ** should alway
bcc0: 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20  s fail.  But we 
bcd0: 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e  will leave it in
bce0: 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62   place just to b
bcf0: 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 23 69 66  e safe..  */.#if
bd00: 20 30 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d   0.  if( pTable-
bd10: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
bd20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bd30: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
bd40: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
bd50: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
bd60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
bd70: 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 1;.  }.#endif
bd80: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
bd90: 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20  e->nCol>=0 );.. 
bda0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
bdb0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
bdc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
bdd0: 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
bde0: 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74  mes..  ** Note t
bdf0: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
be00: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
be10: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
be20: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
be30: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
be40: 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20  the results set 
be50: 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20  of the view and 
be60: 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73  will assign curs
be70: 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ors.  ** to the 
be80: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
be90: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75  FROM clause.  Bu
bea0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  t we do not want
beb0: 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20   these changes. 
bec0: 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e   ** to be perman
bed0: 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d  ent.  So the com
bee0: 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65  putation is done
bef0: 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68   on a copy of th
bf00: 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74  e SELECT.  ** st
bf10: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
bf20: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
bf30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
bf40: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
bf50: 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65  .  pSel = sqlite
bf60: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c  3SelectDup(pTabl
bf70: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e  e->pSelect);.  n
bf80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
bf90: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
bfa0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
bfb0: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
bfc0: 63 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  c);.  pTable->nC
bfd0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54  ol = -1;.  pSelT
bfe0: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
bff0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
c000: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a  arse, 0, pSel);.
c010: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
c020: 20 6e 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61   n;.  if( pSelTa
c030: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c040: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
c050: 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   );.    pTable->
c060: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
c070: 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65  nCol;.    pTable
c080: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
c090: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c  ->aCol;.    pSel
c0a0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
c0b0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
c0c0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
c0d0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
c0e0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62  pSelTab);.    Db
c0f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72  SetProperty(pPar
c100: 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e  se->db, pTable->
c110: 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  iDb, DB_UnresetV
c120: 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iews);.  }else{.
c130: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
c140: 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b   = 0;.    nErr++
c150: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
c160: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  );.  return nErr
c180: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
c190: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c1a0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
c1b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
c1c0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
c1d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
c1e0: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
c1f0: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
c200: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
c210: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
c220: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
c230: 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
c240: 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73  *i;.  if( !DbHas
c250: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
c260: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
c270: 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
c280: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
c290: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
c2a0: 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  x].tblHash); i; 
c2b0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
c2c0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
c2d0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c2e0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
c2f0: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
c300: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c310: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
c320: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
c330: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
c340: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
c350: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
c360: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
c370: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
c380: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
c390: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c3a0: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
c3b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
c3c0: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
c3d0: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
c3e0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
c3f0: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
c400: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
c410: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
c420: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
c430: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
c440: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
c450: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
c460: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
c470: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
c480: 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   iTo..*/.#ifndef
c490: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c4a0: 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
c4b0: 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
c4c0: 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69  d(Db *pDb, int i
c4d0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
c4e0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
c4f0: 6d 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65  m;.  .  for(pEle
c500: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
c510: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29  t(&pDb->tblHash)
c520: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
c530: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
c540: 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
c550: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c560: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
c570: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
c580: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
c590: 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
c5a0: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
c5b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  n;.    }.  }.  f
c5c0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
c5d0: 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69  ashFirst(&pDb->i
c5e0: 64 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  dxHash); pElem; 
c5f0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
c600: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
c610: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
c620: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
c630: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
c640: 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
c650: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
c660: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
c670: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c680: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b    }.  assert(0);
c690: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c6a0: 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
c6b0: 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
c6c0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
c6d0: 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
c6e0: 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
c6f0: 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
c700: 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
c710: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
c720: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
c730: 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
c740: 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
c750: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
c760: 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
c770: 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
c780: 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
c790: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
c7a0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
c7b0: 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
c7c0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
c7d0: 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
c7e0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
c7f0: 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
c800: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c810: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c820: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c830: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
c840: 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29  oy, iTable, iDb)
c850: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c860: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c870: 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
c880: 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67   pushes an integ
c890: 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  er onto the stac
c8a0: 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  k. If this integ
c8b0: 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
c8c0: 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
c8d0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
c8e0: 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
c8f0: 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
c900: 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
c910: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
c920: 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
c930: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
c940: 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
c950: 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
c960: 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20 74  ** The "#0" in t
c970: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
c980: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
c990: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
c9a0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f   value.  ** is o
c9b0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
c9c0: 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c   stack.  See sql
c9d0: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
c9e0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
c9f0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
ca00: 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
ca10: 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
ca20: 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
ca30: 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  #0 AND rootpage=
ca40: 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  #0",.     pParse
ca50: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
ca60: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
ca70: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29  LE(iDb), iTable)
ca80: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ca90: 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64  * Write VDBE cod
caa0: 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65  e to erase table
cab0: 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73   pTab and all as
cac0: 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73  sociated indices
cad0: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64   on disk..** Cod
cae0: 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
caf0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
cb00: 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61  bles and interna
cb10: 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74  l schema definit
cb20: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20  ions.** in case 
cb30: 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f  a root-page belo
cb40: 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72  nging to another
cb50: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
cb60: 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  by the btree lay
cb70: 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64  er.** is also ad
cb80: 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61  ded (this can ha
cb90: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
cba0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
cbb0: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e)..*/.static vo
cbc0: 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28  id destroyTable(
cbd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
cbe0: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66  able *pTab){.#if
cbf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc00: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64  AUTOVACUUM.  Ind
cc10: 65 78 20 2a 70 49 64 78 3b 0a 20 20 64 65 73 74  ex *pIdx;.  dest
cc20: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
cc30: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
cc40: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f  pTab->iDb);.  fo
cc50: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
cc60: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
cc70: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
cc80: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
cc90: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
cca0: 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29  tnum, pIdx->iDb)
ccb0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
ccc0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
ccd0: 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
cce0: 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
ccf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cd00: 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
cd10: 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
cd20: 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
cd30: 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
cd40: 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
cd50: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
cd60: 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
cd70: 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
cd80: 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
cd90: 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
cda0: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
cdb0: 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
cdc0: 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
cdd0: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
cde0: 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
cdf0: 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
ce00: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
ce10: 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
ce20: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
ce30: 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
ce40: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
ce50: 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
ce60: 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
ce70: 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
ce80: 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
ce90: 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
cea0: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
ceb0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
cec0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
ced0: 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
cee0: 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
cef0: 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
cf00: 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
cf10: 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
cf20: 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
cf30: 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
cf40: 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
cf50: 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
cf60: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
cf70: 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
cf80: 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
cf90: 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
cfa0: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
cfb0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
cfc0: 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
cfd0: 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
cfe0: 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
cff0: 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
d000: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
d010: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
d020: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
d030: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
d040: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
d050: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
d060: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
d070: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
d080: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b  Db==pTab->iDb );
d090: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
d0a0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
d0b0: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
d0c0: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
d0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
d0e0: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
d0f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d100: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
d110: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 65 73   return;.    des
d120: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
d130: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 70  rse, iLargest, p
d140: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69  Tab->iDb);.    i
d150: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
d160: 67 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gest;.  }.#endif
d170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d180: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d190: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
d1a0: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
d1b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
d1c0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
d1d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
d1e0: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
d1f0: 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
d200: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
d210: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
d220: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  me, int isView){
d230: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
d240: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
d250: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d260: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
d270: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
d280: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
d290: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
d2a0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
d2b0: 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  table;.  assert(
d2c0: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
d2d0: 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
d2e0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
d2f0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
d300: 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
d310: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
d320: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
d330: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
d340: 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d  p_table;.  iDb =
d350: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73   pTab->iDb;.  as
d360: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
d370: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23  iDb<db->nDb );.#
d380: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d390: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
d3a0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
d3b0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
d3c0: 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
d3d0: 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62  _TABLE(pTab->iDb
d3e0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
d3f0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
d400: 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  [pTab->iDb].zNam
d410: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
d420: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
d430: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
d440: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
d450: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
d460: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
d470: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
d480: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
d490: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
d4a0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
d4b0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
d4c0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
d4d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d4e0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
d4f0: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
d500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d510: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
d520: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
d530: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
d540: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
d550: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
d560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d570: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
d580: 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
d590: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d5a0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
d5b0: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
d5c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
d5d0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
d5e0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
d5f0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
d600: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
d610: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
d620: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
d630: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
d640: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
d650: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
d660: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
d670: 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
d680: 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62  Only || pTab==db
d690: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54  ->aDb[iDb].pSeqT
d6a0: 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
d6b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d6c0: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
d6d0: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
d6e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
d6f0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
d700: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
d710: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d720: 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
d730: 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
d740: 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
d750: 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
d760: 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
d770: 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
d780: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
d790: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
d7a0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
d7b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d7c0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
d7d0: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
d7e0: 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
d7f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
d800: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
d810: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
d820: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
d830: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
d840: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d850: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
d860: 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
d870: 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
d880: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
d890: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
d8a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
d8b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d8c0: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
d8d0: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
d8e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
d8f0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
d900: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d910: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d920: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
d930: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 69  *pTrigger;.    i
d940: 6e 74 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  nt iDb = pTab->i
d950: 44 62 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  Db;.    Db *pDb 
d960: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
d970: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
d980: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
d990: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
d9a0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
d9b0: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
d9c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
d9d0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
d9e0: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
d9f0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
da00: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
da10: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
da20: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
da30: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
da40: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
da50: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
da60: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
da70: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
da80: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
da90: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
daa0: 67 65 72 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c  ger->iDb==iDb ||
dab0: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
dac0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
dad0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
dae0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
daf0: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54 72  r, 1);.      pTr
db00: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
db10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
db20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
db30: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
db40: 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
db50: 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
db60: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
db70: 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
db80: 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
db90: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
dba0: 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
dbb0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
dbc0: 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
dbd0: 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
dbe0: 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
dbf0: 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
dc00: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
dc10: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
dc20: 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
dc30: 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
dc40: 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
dc50: 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
dc60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
dc70: 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  b->autoInc ){.  
dc80: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
dc90: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
dca0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
dcb0: 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
dcc0: 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
dcd0: 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
dce0: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
dcf0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
dd00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
dd10: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
dd20: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
dd30: 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
dd40: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
dd50: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
dd60: 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
dd70: 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
dd80: 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
dd90: 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
dda0: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
ddb0: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
ddc0: 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
ddd0: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
dde0: 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
ddf0: 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
de00: 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
de10: 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
de20: 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
de30: 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
de40: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
de50: 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
de60: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
de70: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
de80: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
de90: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
dea0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
deb0: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
dec0: 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
ded0: 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
dee0: 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
def0: 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  '",.        pDb-
df00: 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
df10: 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
df20: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
df30: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
df40: 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
df50: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
df60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
df70: 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  ve the table ent
df80: 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73  ry from SQLite's
df90: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
dfa0: 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20   and modify.    
dfb0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
dfc0: 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  okie..    */.   
dfd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
dfe0: 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
dff0: 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a   iDb, 0, pTab->z
e000: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
e010: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
e020: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20  e(db, v, iDb);. 
e030: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
e040: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
e050: 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
e060: 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
e070: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
e080: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e090: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e0a0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
e0b0: 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
e0c0: 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
e0d0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
e0e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
e0f0: 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
e100: 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
e110: 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
e120: 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
e130: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
e140: 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
e150: 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
e160: 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
e170: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
e180: 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
e190: 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
e1a0: 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
e1b0: 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20   to.  pToCol is 
e1c0: 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
e1d0: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   in the other.**
e1e0: 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20   pTo table that 
e1f0: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
e200: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67  points to.  flag
e210: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
e220: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
e230: 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
e240: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
e250: 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
e260: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
e270: 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
e280: 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
e290: 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
e2a0: 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
e2b0: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
e2c0: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
e2d0: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
e2e0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
e2f0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
e300: 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
e310: 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a    The new FKey.*
e320: 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20  * is not linked 
e330: 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61  into db->aFKey a
e340: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74  t this point - t
e350: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  hat does not hap
e360: 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c  pen.** until sql
e370: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
e380: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
e390: 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
e3a0: 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
e3b0: 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
e3c0: 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
e3d0: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
e3e0: 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
e3f0: 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
e400: 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
e410: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
e420: 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
e430: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e440: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e450: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e460: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
e470: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
e480: 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
e490: 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
e4a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
e4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
e4c0: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
e4d0: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
e4e0: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
e4f0: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
e500: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
e510: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
e520: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
e530: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
e540: 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
e550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e560: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
e570: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
e580: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  0;.  Table *p = 
e590: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
e5a0: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
e5b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
e5c0: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
e5d0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
e5e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
e5f0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
e600: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
e610: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
e620: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
e630: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
e640: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67    if( iCol<0 ) g
e650: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
e660: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
e670: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
e680: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
e690: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e6a0: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
e6b0: 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
e6c0: 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
e6d0: 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
e6e0: 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
e6f0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
e700: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
e710: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
e720: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
e730: 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
e740: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
e750: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
e760: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
e770: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e780: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
e790: 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
e7a0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
e7b0: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
e7c0: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
e7d0: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
e7e0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
e7f0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
e800: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
e810: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
e820: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
e830: 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
e840: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
e850: 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
e860: 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
e870: 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
e880: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
e890: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e8a0: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
e8b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
e8c0: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
e8d0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
e8e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
e8f0: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
e900: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
e910: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
e920: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
e930: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
e940: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
e950: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
e960: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
e970: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
e980: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
e990: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
e9a0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
e9b0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
e9c0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
e9d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
e9e0: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
e9f0: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
ea00: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
ea10: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
ea20: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
ea30: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
ea40: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
ea50: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
ea60: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
ea70: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
ea80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ea90: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
eaa0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
eab0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
eac0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
ead0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
eae0: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
eaf0: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
eb00: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
eb10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
eb20: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
eb30: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
eb40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
eb50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
eb60: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
eb70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
eb90: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
eba0: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
ebb0: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
ebc0: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
ebd0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
ebe0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
ebf0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
ec00: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
ec10: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
ec20: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
ec30: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ec40: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
ec50: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
ec60: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
ec70: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
ec80: 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
ec90: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
eca0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
ecb0: 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
ecc0: 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
ecd0: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
ece0: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
ecf0: 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
ed00: 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61  deleteConf = fla
ed10: 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b  gs & 0xff;.  pFK
ed20: 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d  ey->updateConf =
ed30: 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26   (flags >> 8 ) &
ed40: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
ed50: 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c  insertConf = (fl
ed60: 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78  ags >> 16 ) & 0x
ed70: 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  ff;..  /* Link t
ed80: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
ed90: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
eda0: 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
edb0: 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
edc0: 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
edd0: 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
ede0: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
edf0: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
ee00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ee10: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
ee20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
ee30: 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f  stDelete(pFromCo
ee40: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
ee50: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43  rListDelete(pToC
ee60: 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
ee70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ee80: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
ee90: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
eea0: 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
eeb0: 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
eec0: 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
eed0: 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
eee0: 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
eef0: 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
ef00: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
ef10: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
ef20: 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
ef30: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
ef40: 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
ef50: 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
ef60: 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
ef70: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
ef80: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
ef90: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
efa0: 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
efb0: 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
efc0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
efd0: 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
efe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
eff0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
f000: 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
f010: 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
f020: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
f030: 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
f040: 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
f050: 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
f060: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
f070: 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72  erred = isDeferr
f080: 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
f090: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f0a0: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
f0b0: 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
f0c0: 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
f0d0: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
f0e0: 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
f0f0: 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
f100: 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
f110: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
f120: 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
f130: 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
f140: 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
f150: 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
f160: 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
f170: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
f180: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
f190: 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
f1a0: 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  The memory cell 
f1b0: 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
f1c0: 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
f1d0: 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
f1e0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
f1f0: 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
f200: 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
f210: 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
f220: 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
f230: 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
f240: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
f250: 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
f260: 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
f270: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
f280: 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
f290: 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
f2a0: 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
f2b0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
f2c0: 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
f2d0: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
f2e0: 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
f2f0: 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
f300: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
f310: 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
f320: 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
f330: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
f340: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
f350: 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  b;       /* Btre
f360: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
f370: 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
f380: 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
f390: 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74  Tab+1;     /* Bt
f3a0: 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
f3b0: 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
f3c0: 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3e0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
f3f0: 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
f400: 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f420: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
f430: 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
f460: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
f470: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
f480: 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
f490: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
f4a0: 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
f4b0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f4c0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
f4d0: 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
f4e0: 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70  Name, 0,.      p
f4f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 70  Parse->db->aDb[p
f500: 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Index->iDb].zNam
f510: 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
f520: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
f530: 20 2f 2a 20 45 6e 73 75 72 65 20 61 6c 6c 20 74   /* Ensure all t
f540: 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 6c  he required coll
f550: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
f560: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  are available. T
f570: 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  his.  ** routine
f580: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
f590: 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65   collation-neede
f5a0: 64 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 6e 65  d callback if ne
f5b0: 63 65 73 73 61 72 79 20 28 61 6e 64 0a 20 20 2a  cessary (and.  *
f5c0: 2a 20 69 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * if one has bee
f5d0: 6e 20 72 65 67 69 73 74 65 72 65 64 29 2e 0a 20  n registered).. 
f5e0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
f5f0: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
f600: 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  eq(pParse, pInde
f610: 78 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  x) ){.    return
f620: 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
f630: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f640: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
f650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f660: 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
f670: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f680: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
f690: 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67  Load, memRootPag
f6a0: 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20  e, 0);.    tnum 
f6b0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
f6c0: 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
f6d0: 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >tnum;.    sqlit
f6e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f6f0: 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70  P_Clear, tnum, p
f700: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d  Index->iDb);.  }
f710: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f720: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
f730: 72 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20  r, pIndex->iDb, 
f740: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
f750: 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  eOp3(v, OP_OpenW
f760: 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
f770: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f780: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49        (char*)&pI
f790: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50  ndex->keyInfo, P
f7a0: 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  3_KEYINFO);.  sq
f7b0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f  lite3OpenTableFo
f7c0: 72 52 65 61 64 69 6e 67 28 76 2c 20 69 54 61 62  rReading(v, iTab
f7d0: 2c 20 70 54 61 62 29 3b 0a 20 20 61 64 64 72 31  , pTab);.  addr1
f7e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f7f0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
f800: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
f810: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
f820: 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c  exKey(v, pIndex,
f830: 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70 49   iTab);.  if( pI
f840: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
f850: 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e  E_None ){.    in
f860: 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c 69  t curaddr = sqli
f870: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f880: 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 61  dr(v);.    int a
f890: 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b 34  ddr2 = curaddr+4
f8a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f8b0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75 72  eChangeP2(v, cur
f8c0: 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b 0a  addr-1, addr2);.
f8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f8e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
f8f0: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
f900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f910: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
f920: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
f930: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f940: 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c  _IsUnique, iIdx,
f950: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
f960: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
f970: 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
f980: 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41 62  ONSTRAINT, OE_Ab
f990: 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
f9a0: 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65           "indexe
f9b0: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  d columns are no
f9c0: 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54  t unique", P3_ST
f9d0: 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65 72  ATIC);.    asser
f9e0: 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74 65  t( addr2==sqlite
f9f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
fa00: 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (v) );.  }.  sql
fa10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fa20: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
fa30: 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Idx, 0);.  sqlit
fa40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fa50: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
fa60: 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
fa70: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
fa80: 20 61 64 64 72 31 2c 20 73 71 6c 69 74 65 33 56   addr1, sqlite3V
fa90: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
faa0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
fab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
fac0: 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  se, iTab, 0);.  
fad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fae0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
faf0: 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx, 0);.}../*.**
fb00: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
fb10: 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
fb20: 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
fb30: 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
fb40: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
fb50: 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
fb60: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
fb70: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
fb80: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
fb90: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
fba0: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
fbb0: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
fbc0: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
fbd0: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
fbe0: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
fbf0: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
fc00: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
fc10: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
fc20: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
fc30: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
fc40: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
fc50: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
fc60: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
fc70: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
fc80: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
fc90: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
fca0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
fcb0: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
fcc0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
fcd0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
fce0: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
fcf0: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
fd00: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
fd10: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
fd20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
fd30: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
fd40: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
fd50: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
fd60: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
fd70: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
fd80: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
fd90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
fda0: 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
fdb0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
fdc0: 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
fdd0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
fde0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
fdf0: 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
fe00: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
fe10: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
fe20: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
fe30: 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
fe40: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
fe50: 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
fe60: 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
fe70: 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
fe80: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
fe90: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
fea0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
feb0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
fec0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
fed0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
fee0: 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
fef0: 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
ff00: 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
ff10: 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
ff20: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
ff30: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
ff40: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
ff50: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
ff60: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
ff70: 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 54  pEnd        /* T
ff80: 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
ff90: 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
ffa0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
ffb0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
ffc0: 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c  b = 0;   /* Tabl
ffd0: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
ffe0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
fff0: 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69  ex = 0; /* The i
10000 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
10010 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
10020 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
10030 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
10040 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
10050 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
10060 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
10070 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
10080 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
10090 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
100a0 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
100b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
100c0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74  arse->db;..  int
100d0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f   iDb;          /
100e0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
100f0 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
10100 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
10110 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
10120 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66  = 0; /* Unqualif
10130 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
10140 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
10150 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
10160 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
10170 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
10180 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
10190 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a  te_index;..  /*.
101a0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
101b0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
101c0 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
101d0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
101e0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
101f0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
10200 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
10210 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
10220 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
10230 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
10240 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
10250 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
10260 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
10270 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
10280 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
10290 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
102a0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
102b0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
102c0 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
102d0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
102e0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
102f0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
10300 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
10310 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
10320 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10330 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10340 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
10350 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
10360 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
10370 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
10380 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
10390 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
103a0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
103b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
103c0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
103d0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
103e0 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
103f0 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
10400 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
10410 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
10420 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44  pTab && pTab->iD
10430 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44  b==1 ){.      iD
10440 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  b = 1;.    }.#en
10450 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
10460 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
10470 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
10480 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
10490 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
104a0 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
104b0 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
104c0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
104d0 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
104e0 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
104f0 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
10500 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
10510 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
10520 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
10530 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
10540 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
10550 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
10560 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
10570 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  e(pParse, pTblNa
10580 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
10590 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d  .        pTblNam
105a0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
105b0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  e);.    if( !pTa
105c0 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
105d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
105e0 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61  assert( iDb==pTa
105f0 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73  b->iDb );.  }els
10600 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
10610 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
10620 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
10630 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44  NewTable;.    iD
10640 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
10650 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   }..  if( pTab==
10660 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
10670 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
10680 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
10690 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
106a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
106b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
106c0 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
106d0 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
106e0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
106f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10700 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
10710 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10720 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
10730 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
10740 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10750 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
10760 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
10770 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
10780 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10790 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
107a0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
107b0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
107c0 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
107d0 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
107e0 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
107f0 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
10800 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
10810 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
10820 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
10830 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
10840 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
10850 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
10860 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
10870 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
10880 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
10890 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
108a0 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
108b0 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
108c0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
108d0 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
108e0 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
108f0 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
10900 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
10910 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
10920 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
10930 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
10940 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
10950 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
10960 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
10970 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
10980 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
10990 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
109a0 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
109b0 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
109c0 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
109d0 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
109e0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
109f0 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  en(pName);.    i
10a00 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
10a10 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
10a20 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
10a30 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10a40 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
10a50 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
10a60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10a70 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10a80 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
10a90 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
10aa0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
10ab0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10ac0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
10ad0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
10ae0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
10af0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
10b00 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
10b10 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
10b20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10b30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10b40 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
10b50 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
10b60 62 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  b].zName)!=0 ){.
10b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10b80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10b90 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
10ba0 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
10bb0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
10bc0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10bd0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
10be0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
10bf0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
10c00 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
10c10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10c20 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
10c30 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
10c40 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
10c50 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
10c60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10c70 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
10c80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10c90 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
10ca0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
10cb0 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
10cc0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
10cd0 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
10ce0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
10cf0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
10d00 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
10d10 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20  f,"_%d",n);.    
10d20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
10d30 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
10d40 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  &zName, "sqlite_
10d50 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61  autoindex_", pTa
10d60 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20  b->zName, zBuf, 
10d70 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
10d80 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
10d90 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10da0 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
10db0 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
10dc0 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
10dd0 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
10de0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10df0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
10e00 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
10e10 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
10e20 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
10e30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10e40 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10e50 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
10e60 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10e70 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
10e80 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10e90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10ea0 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
10eb0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
10ec0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
10ed0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
10ee0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
10ef0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
10f00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
10f10 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10f20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
10f30 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
10f40 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10f50 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10f60 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
10f70 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
10f80 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
10f90 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
10fa0 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
10fb0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
10fc0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
10fd0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
10fe0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
10ff0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
11000 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
11010 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
11020 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
11030 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
11040 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
11050 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
11060 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
11070 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
11080 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
11090 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
110a0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
110b0 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
110c0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
110d0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
110e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
110f0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
11100 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
11110 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
11120 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
11130 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
11140 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
11150 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73 69 7a  zName) + 1 + siz
11160 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20 20 20  eof(int) +.     
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a     (sizeof(int)*
11190 32 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  2 + sizeof(CollS
111a0 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
111b0 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  pr );.  if( sqli
111c0 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
111d0 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
111e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
111f0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
11200 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e   (int*)&pIndex->
11210 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c  keyInfo.aColl[pL
11220 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70  ist->nExpr];.  p
11230 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
11240 3d 20 28 75 6e 73 69 67 6e 65 64 2a 29 26 70 49  = (unsigned*)&pI
11250 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  ndex->aiColumn[p
11260 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
11270 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
11280 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
11290 61 69 52 6f 77 45 73 74 5b 70 4c 69 73 74 2d 3e  aiRowEst[pList->
112a0 6e 45 78 70 72 2b 31 5d 3b 0a 20 20 73 74 72 63  nExpr+1];.  strc
112b0 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
112c0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
112d0 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
112e0 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
112f0 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
11300 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
11310 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
11320 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
11330 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
11340 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
11350 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
11360 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
11370 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11380 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
11390 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
113a0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
113b0 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
113c0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
113d0 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
113e0 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
113f0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
11400 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
11410 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
11420 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  r; i++){.    for
11430 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
11440 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
11450 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11460 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
11470 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
11480 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
11490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
114a0 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
114b0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
114c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
114d0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
114e0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
114f0 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
11500 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
11510 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
11520 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11530 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11540 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
11550 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
11560 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
11570 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20  a[i].pExpr ){.  
11580 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
11590 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
115a0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49  Coll );.      pI
115b0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
115c0 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e  oll[i] = pList->
115d0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
115e0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
115f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
11600 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
11610 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
11620 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ll;.    }.    as
11630 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65  sert( pIndex->ke
11640 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29  yInfo.aColl[i] )
11650 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
11660 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20  nit.busy && .   
11670 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
11680 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
11690 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
116a0 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20  .aColl[i]) .    
116b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
116c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
116d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e  .    }.  }.  pIn
116e0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
116f0 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  eld = pList->nEx
11700 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 66  pr;.  sqlite3Def
11710 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
11720 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
11730 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
11740 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
11750 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
11760 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
11770 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
11780 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
11790 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
117a0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
117b0 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
117c0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
117d0 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
117e0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
117f0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
11800 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
11810 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
11820 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
11830 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
11840 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
11850 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
11860 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
11870 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
11880 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
11890 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
118a0 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
118b0 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
118c0 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
118d0 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
118e0 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
118f0 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
11900 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
11910 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
11920 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
11930 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
11940 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
11950 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
11960 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
11970 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
11980 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
11990 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
119a0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
119b0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
119c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
119d0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
119e0 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
119f0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
11a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
11a10 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
11a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11a30 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
11a40 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
11a50 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
11a60 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
11a70 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
11a80 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
11a90 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
11aa0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
11ab0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
11ac0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
11ad0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
11ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
11af0 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
11b00 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  l[k]!=pIndex->ke
11b10 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29  yInfo.aColl[k] )
11b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11b30 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
11b40 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
11b50 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
11b60 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
11b70 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
11b80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
11b90 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
11ba0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
11bb0 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
11bc0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
11bd0 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
11be0 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
11bf0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
11c00 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
11c10 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
11c20 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
11c30 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
11c40 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
11c50 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
11c60 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
11c70 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
11c80 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
11c90 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
11ca0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
11cb0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
11cc0 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
11cd0 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
11ce0 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
11cf0 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
11d00 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
11d10 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
11d20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
11d30 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
11d40 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
11d50 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
11d60 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
11d70 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
11d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11d90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
11dc0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
11dd0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
11de0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11df0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
11e00 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
11e10 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
11e20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
11e30 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
11e40 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
11e50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11e60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11e70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
11e80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
11e90 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
11ea0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
11eb0 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
11ec0 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
11ed0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
11ee0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
11ef0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
11f00 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
11f10 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
11f20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
11f30 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
11f40 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78  pIndex->iDb].idx
11f50 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
11f80 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
11f90 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
11fa0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
11fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
11fc0 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
11fd0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
11fe0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f  iled */.      go
11ff0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12000 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
12010 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
12020 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
12030 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
12040 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
12050 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
12060 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
12070 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12080 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
12090 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
120a0 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
120b0 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
120c0 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
120d0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
120e0 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
120f0 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
12100 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
12110 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
12120 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
12130 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
12140 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
12150 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
12160 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
12170 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
12180 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
12190 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
121a0 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
121b0 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
121c0 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
121d0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
121e0 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
121f0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
12200 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
12210 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
12220 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
12230 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
12240 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
12250 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
12260 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
12270 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
12280 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
12290 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
122a0 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
122b0 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
122c0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
122d0 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
122e0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
122f0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
12300 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
12310 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
12320 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
12330 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
12340 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
12350 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
12360 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
12370 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
12380 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
12390 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
123a0 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
123b0 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
123c0 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20  Mem++;..    v = 
123d0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
123e0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
123f0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
12400 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
12410 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
12420 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
12430 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  he index.    */.
12440 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12450 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
12460 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
12470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12480 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
12490 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b  eIndex, iDb, 0);
124a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
124b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
124c0 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  tore, iMem, 0);.
124d0 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
124e0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
124f0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
12500 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
12510 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
12520 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
12530 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
12540 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
12550 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
12560 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
12570 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
12580 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
12590 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
125a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43  qlite3MPrintf("C
125b0 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
125c0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
125d0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
125e0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
125f0 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20          pEnd->z 
12600 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a  - pName->z + 1,.
12610 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
12620 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12630 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
12640 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
12650 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
12660 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
12670 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
12680 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
12690 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
126a0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
126b0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
126c0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
126d0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
126e0 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
126f0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
12700 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
12710 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
12720 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
12730 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
12740 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a  %Q,%Q,#0,%Q);",.
12750 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
12760 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
12770 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
12780 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
12790 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
127a0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
127b0 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
127c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
127d0 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
127e0 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
127f0 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20  eFree(zStmt);.. 
12800 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
12810 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
12820 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
12830 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
12840 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
12850 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
12860 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
12870 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
12880 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
12890 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
128a0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
128b0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
128c0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
128d0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
128e0 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
128f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
12900 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
12910 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20  ema, iDb, 0,.   
12920 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
12930 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22  intf("name='%q'"
12940 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
12950 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
12960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12970 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69  AddOp(v, OP_Expi
12980 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  re, 0, 0);.    }
12990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
129a0 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
129b0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
129c0 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
129d0 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
129e0 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
129f0 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
12a00 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
12a10 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
12a20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
12a30 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
12a40 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
12a50 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
12a60 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
12a70 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
12a80 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
12a90 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
12aa0 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
12ab0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
12ac0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
12ad0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
12ae0 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
12af0 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
12b00 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
12b10 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
12b20 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
12b30 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
12b40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12b50 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
12b60 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
12b70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
12b80 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
12b90 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
12ba0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
12bb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
12bc0 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
12bd0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
12be0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
12bf0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
12c00 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
12c10 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
12c20 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
12c30 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
12c40 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
12c50 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
12c60 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
12c70 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
12c80 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64    freeIndex(pInd
12c90 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
12ca0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
12cb0 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
12cc0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
12cd0 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
12ce0 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
12cf0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
12d00 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
12d10 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
12d20 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
12d30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
12d40 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
12d50 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
12d60 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
12d70 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
12d80 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
12d90 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
12da0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
12db0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
12dc0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
12dd0 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
12de0 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
12df0 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
12e00 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
12e10 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
12e20 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
12e30 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
12e40 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
12e50 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
12e60 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
12e70 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
12e80 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
12e90 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
12ea0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
12eb0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
12ec0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
12ed0 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
12ee0 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
12ef0 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
12f00 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
12f10 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
12f20 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
12f30 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
12f40 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
12f50 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
12f60 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
12f70 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
12f80 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
12f90 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
12fa0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
12fb0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
12fc0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
12fd0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
12fe0 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
12ff0 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
13000 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
13010 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
13020 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
13030 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
13040 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
13050 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
13060 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
13070 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
13080 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
13090 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
130a0 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
130b0 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
130c0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
130d0 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  1; i--){.    a[i
130e0 5d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66  ] = 10;.  }.  if
130f0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
13100 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
13110 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
13120 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
13130 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13140 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
13150 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
13160 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
13170 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
13180 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
13190 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
131a0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
131b0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
131c0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29   SrcList *pName)
131d0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
131e0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
131f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13200 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
13210 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
13220 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
13230 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  failed ){.    go
13240 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
13250 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
13260 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
13270 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
13280 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
13290 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
132a0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
132b0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
132c0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
132d0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
132e0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
132f0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
13300 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
13310 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
13320 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13330 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
13340 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
13350 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
13360 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
13370 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
13380 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
13390 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
133a0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
133b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
133c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
133d0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
133e0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
133f0 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
13400 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
13410 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13420 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
13430 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13440 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13450 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
13460 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
13470 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13480 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
13490 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
134a0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
134b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
134c0 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
134d0 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
134e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
134f0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
13500 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
13510 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13520 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13530 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
13540 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
13550 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13560 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13570 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
13580 54 5f 54 45 4d 50 44 42 20 26 26 20 70 49 6e 64  T_TEMPDB && pInd
13590 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
135a0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
135b0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
135c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
135d0 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
135e0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
135f0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
13600 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13610 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13620 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13630 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13640 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
13650 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
13660 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
13670 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
13680 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13690 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
136a0 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e     int iDb = pIn
136b0 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71  dex->iDb;.    sq
136c0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
136d0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
136e0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
136f0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
13700 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
13710 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
13720 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
13730 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
13740 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
13750 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
13760 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
13770 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
13780 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
13790 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
137a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
137b0 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49  eOp3(v, OP_DropI
137c0 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49  ndex, iDb, 0, pI
137d0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
137e0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
137f0 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
13800 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
13810 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
13820 70 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e  pArray points in
13830 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77  to a structure w
13840 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
13850 20 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a   array pointer.*
13860 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77  * followed by tw
13870 6f 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  o integers. The 
13880 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73  first integer is
13890 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
138a0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
138b0 65 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61  e structure arra
138c0 79 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69  y.  The second i
138d0 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65  nteger.** is the
138e0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63   number of alloc
138f0 61 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68  ated slots in th
13900 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  e array..**.** I
13910 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
13920 68 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f  he structure loo
13930 6b 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ks something lik
13940 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
13950 20 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d       struct Exam
13960 70 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20  ple1 {.**       
13970 20 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65     struct subEle
13980 6d 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  m *aEntry;.**   
13990 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72         int nEntr
139a0 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
139b0 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20  nt nAlloc;.**   
139c0 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
139d0 20 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74   pnEntry paramet
139e0 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
139f0 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45   equivalent of E
13a00 78 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a  xample1.nEntry..
13a10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13a20 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  ne allocates a n
13a30 65 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61  ew slot in the a
13a40 72 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f  rray, zeros it o
13a50 75 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ut,.** and retur
13a60 6e 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49  ns its index.  I
13a70 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61  f malloc fails a
13a80 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
13a90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
13aa0 0a 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74  .** szEntry is t
13ab0 68 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73  he sizeof of a s
13ac0 69 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72  ingle array entr
13ad0 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
13ae0 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
13af0 66 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20  f array entries 
13b00 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
13b10 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
13b20 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
13b30 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
13b40 28 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c  (void **ppArray,
13b50 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e   int szEntry, in
13b60 74 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63  t initSize){.  c
13b70 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61  har *p;.  int *a
13b80 6e 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72  n = (int*)&ppArr
13b90 61 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b  ay[1];.  if( an[
13ba0 30 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20  0]>=an[1] ){.   
13bb0 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20   void *pNew;.   
13bc0 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20   int newSize;.  
13bd0 20 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31    newSize = an[1
13be0 5d 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  ]*2 + initSize;.
13bf0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
13c00 65 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61  eRealloc(*ppArra
13c10 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
13c20 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
13c30 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  w==0 ){.      re
13c40 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
13c50 20 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69     an[1] = newSi
13c60 7a 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79  ze;.    *ppArray
13c70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
13c80 20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d   = *ppArray;.  m
13c90 65 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73  emset(&p[an[0]*s
13ca0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
13cb0 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  try);.  return a
13cc0 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n[0]++;.}../*.**
13cd0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
13ce0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
13cf0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
13d00 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
13d10 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
13d20 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
13d30 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
13d40 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
13d50 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
13d60 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
13d70 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
13d80 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
13d90 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
13da0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13db0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
13dc0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
13dd0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
13de0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
13df0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
13e00 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
13e10 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c  0;.  }.  i = sql
13e20 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
13e30 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74  e((void**)&pList
13e40 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  ->a, sizeof(pLis
13e50 74 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20  t->a[0]), 5);.  
13e60 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
13e70 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
13e80 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  te(pList);.    r
13e90 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
13ea0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
13eb0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
13ec0 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
13ed0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
13ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
13ef0 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
13f00 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
13f10 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
13f20 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
13f30 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13f40 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
13f50 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
13f60 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
13f70 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
13f80 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
13f90 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
13fa0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
13fb0 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
13fc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13fd0 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
13fe0 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
13ff0 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
14000 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
14010 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
14020 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
14030 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
14040 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
14050 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
14060 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14070 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
14080 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14090 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
140a0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
140b0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
140c0 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
140d0 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
140e0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
140f0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
14100 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
14110 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
14120 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
14130 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
14140 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
14150 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
14160 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
14170 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
14180 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
14190 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
141a0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
141b0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
141c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
141d0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
141e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
141f0 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
14200 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
14210 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
14220 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
14230 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
14240 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
14250 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
14260 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
14270 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
14280 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
14290 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
142a0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
142b0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
142c0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
142d0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
142e0 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
142f0 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
14300 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
14310 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
14320 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
14330 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
14340 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
14350 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
14360 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
14370 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
14380 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
14390 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
143a0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
143b0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
143c0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
143d0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
143e0 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,0);.**.** 
143f0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
14400 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
14410 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
14420 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
14430 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
14440 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
14450 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
14460 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b  stAppend(A,B,C);
14470 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
14480 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
14490 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
144a0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53  abase name..*/.S
144b0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
144c0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
144d0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
144e0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
144f0 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
14500 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14510 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
14520 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
14530 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
14540 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
14550 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
14560 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
14570 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
14580 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
14590 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
145a0 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
145b0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
145c0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
145d0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
145e0 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
145f0 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
14600 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14610 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
14620 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   + (pList->nAllo
14630 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  c-1)*sizeof(pLis
14640 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
14650 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
14660 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
14670 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
14680 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
14690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
146a0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
146b0 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
146c0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a  a[pList->nSrc];.
146d0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
146e0 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
146f0 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
14700 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
14710 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
14720 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
14730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
14740 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
14750 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
14760 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
14770 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
14780 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
14790 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
147a0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
147b0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
147c0 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a  mToken(pTable);.
147d0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
147e0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
147f0 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62  FromToken(pDatab
14800 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69  ase);.  pItem->i
14810 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
14820 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
14830 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
14840 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
14850 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
14860 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
14870 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14880 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
14890 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
148a0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
148b0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
148c0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
148d0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
148e0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
148f0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
14900 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
14910 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  ++){.    if( pIt
14920 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
14930 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65   break;.    pIte
14940 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
14950 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
14960 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
14970 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
14980 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
14990 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
149a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
149b0 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  >pSrc);.    }.  
149c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
149d0 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c  n alias to the l
149e0 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f  ast identifier o
149f0 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e  n the given iden
14a00 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a  tifier list..*/.
14a10 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
14a20 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
14a30 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
14a40 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
14a50 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
14a60 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
14a70 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
14a80 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d  nSrc-1].zAlias =
14a90 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
14aa0 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
14ab0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
14ac0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
14ad0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
14ae0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
14af0 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
14b00 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
14b10 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
14b20 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14b30 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14b40 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
14b50 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
14b60 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
14b70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
14b80 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
14b90 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14ba0 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
14bb0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
14bc0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
14bd0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
14be0 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
14bf0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73  ->zAlias);.    s
14c00 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
14c10 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  e(0, pItem->pTab
14c20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
14c30 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d  lectDelete(pItem
14c40 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
14c50 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14c60 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  e(pItem->pOn);. 
14c70 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
14c80 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55  Delete(pItem->pU
14c90 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
14ca0 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
14cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
14cc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14cd0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
14ce0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
14cf0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14d00 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
14d10 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
14d20 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
14d30 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
14d40 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
14d50 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
14d60 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
14d70 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
14d80 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
14d90 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
14da0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
14db0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14dc0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
14dd0 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
14de0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14df0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14e00 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14e10 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
14e20 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
14e30 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
14e40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
14e50 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
14e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e70 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
14e80 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
14e90 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
14ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
14eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14ec0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
14ed0 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
14ee0 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
14ef0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
14f00 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
14f10 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
14f20 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
14f30 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
14f40 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
14f50 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
14f60 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
14f70 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
14f80 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
14f90 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
14fa0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
14fb0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
14fc0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14fd0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
14fe0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
14ff0 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
15000 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
15010 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15020 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15030 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15040 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15050 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
15060 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15070 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
15080 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
15090 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
150a0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
150b0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
150c0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
150d0 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
150e0 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
150f0 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
15100 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
15110 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15120 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
15130 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
15140 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
15150 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
15160 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
15170 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
15180 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
15190 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
151a0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
151b0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
151c0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
151d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
151e0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
151f0 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
15200 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15210 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
15220 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
15230 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
15240 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
15250 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
15260 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
15270 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
15280 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
15290 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
152a0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
152b0 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
152c0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
152d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
152e0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
152f0 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
15300 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
15310 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
15320 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
15330 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d  tory(db, 0, 0, M
15340 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
15350 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
15360 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15370 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
15380 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15390 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
153a0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
153b0 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
153c0 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
153d0 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
153e0 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
153f0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
15400 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
15420 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
15430 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
15440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15450 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
15460 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29  ->aDb[1].pBt, 1)
15470 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15490 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
154a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
154b0 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72  able to get a wr
154c0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20  ite lock on ".  
154d0 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d          "the tem
154e0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
154f0 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20  file");.        
15500 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
15510 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15520 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15530 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15550 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
15560 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
15570 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
15580 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
15590 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
155a0 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
155b0 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
155c0 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
155d0 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
155e0 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
155f0 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
15600 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
15610 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
15620 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
15630 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
15640 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
15650 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
15660 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
15670 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
15680 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
15690 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
156a0 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
156b0 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
156c0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
156d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
156e0 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
156f0 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
15700 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
15710 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
15720 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
15730 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
15740 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
15750 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
15760 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
15770 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
15780 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
15790 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
157a0 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
157b0 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
157c0 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
157d0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
157e0 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
157f0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
15800 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
15810 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
15820 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
15830 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
15840 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
15850 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
15860 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
15870 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
15880 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
15890 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
158a0 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
158b0 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
158c0 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
158d0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
158e0 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
158f0 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
15900 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
15910 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
15920 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
15930 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
15940 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
15950 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
15960 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
15970 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
15980 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
15990 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
159a0 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
159b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
159c0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
159d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
159e0 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
159f0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
15a00 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
15a10 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15a20 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15a30 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
15a40 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
15a50 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
15a60 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
15a70 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
15a80 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
15a90 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
15aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
15ab0 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
15ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ad0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15ae0 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
15af0 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
15b00 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
15b10 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
15b20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
15b30 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
15b40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
15b50 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b  b<32 );.    mask
15b60 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69   = 1<<iDb;.    i
15b70 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  f( (pParse->cook
15b80 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
15b90 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  0 ){.      pPars
15ba0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
15bb0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61   mask;.      pPa
15bc0 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
15bd0 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
15be0 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
15bf0 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
15c00 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
15c10 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
15c20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
15c30 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
15c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15c50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
15c60 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
15c70 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
15c80 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
15c90 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
15ca0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
15cb0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
15cc0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
15cd0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
15ce0 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
15cf0 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
15d00 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
15d10 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
15d20 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
15d30 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
15d40 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
15d50 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
15d60 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
15d70 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
15d80 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
15d90 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
15da0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
15db0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
15dc0 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
15dd0 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
15de0 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
15df0 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
15e00 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
15e10 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
15e20 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
15e30 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
15e40 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
15e50 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
15e60 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
15e70 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
15e80 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
15e90 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
15ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
15eb0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
15ec0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
15ed0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
15ee0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
15ef0 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
15f00 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
15f10 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
15f20 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
15f30 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
15f40 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
15f50 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
15f60 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
15f70 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
15f80 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
15f90 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
15fa0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
15fb0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
15fc0 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
15fd0 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
15fe0 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
15ff0 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
16000 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
16010 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
16020 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
16030 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16040 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
16050 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
16060 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
16070 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
16080 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16090 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
160a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
160b0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
160c0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
160d0 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
160e0 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
160f0 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
16100 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
16110 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
16120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16130 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
16140 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
16150 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
16160 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
16170 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
16180 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
16190 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
161a0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
161b0 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
161c0 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
161d0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
161e0 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
161f0 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
16200 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
16210 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
16220 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
16230 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
16240 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
16250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
16260 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
16270 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43  collationMatch(C
16280 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49  ollSeq *pColl, I
16290 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
162a0 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d   int n = pIndex-
162b0 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b  >keyInfo.nField;
162c0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20  .  CollSeq **pp 
162d0 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  = pIndex->keyInf
162e0 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65  o.aColl;.  while
162f0 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28  ( n-- ){.    if(
16300 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65   *pp==pColl ) re
16310 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b  turn 1;.    pp++
16320 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
16330 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16340 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
16350 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
16360 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
16370 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
16380 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
16390 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
163a0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
163b0 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
163c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
163d0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
163e0 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
163f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16400 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f   Table *pTab, Co
16410 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
16420 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16440 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
16450 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
16460 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
16470 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
16480 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
16490 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
164a0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( pColl==0 || 
164b0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70  collationMatch(p
164c0 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a  Coll,pIndex) ){.
164d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
164e0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
164f0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62  (pParse, 0, pTab
16500 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  ->iDb);.      sq
16510 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16520 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16530 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
16540 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16550 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
16560 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
16570 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
16580 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
16590 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
165a0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
165b0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
165c0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
165d0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
165e0 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
165f0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
16600 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
16610 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
16620 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
16630 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
16640 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
16650 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16670 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
16680 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
166b0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
166c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
166d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
166e0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
166f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16700 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16720 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
16730 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
16740 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16760 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
16770 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
16780 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
16790 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
167a0 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
167b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62  ++){.    if( pDb
167c0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
167d0 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
167e0 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
167f0 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
16800 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
16810 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
16820 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
16830 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
16840 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
16850 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f  Parse, pTab, pCo
16860 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
16870 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
16880 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16890 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
168a0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
168b0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
168e0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
168f0 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
16900 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
16910 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
16920 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
16930 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
16940 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
16950 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
16960 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
16970 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
16980 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
16990 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
169a0 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
169b0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
169c0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
169d0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
169e0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
169f0 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
16a00 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
16a10 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
16a20 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
16a30 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
16a40 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
16a50 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
16a60 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
16a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a80 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
16a90 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
16aa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16ab0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
16ac0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
16ad0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16af0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
16b00 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
16b10 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
16b20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b40 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
16b50 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
16b60 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
16b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16b80 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
16b90 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
16ba0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
16bb0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
16bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
16bd0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
16be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16bf0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
16c00 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
16c10 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16c40 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
16c50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16c60 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
16c70 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16c80 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
16c90 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
16ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16cb0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
16cc0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
16cd0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
16ce0 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
16cf0 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
16d00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
16d10 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
16d20 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
16d30 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
16d40 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
16d50 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
16d60 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
16d70 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
16d80 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16d90 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
16da0 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d  0 || pName1->z==
16db0 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
16dc0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
16dd0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16de0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  ;.  }else if( pN
16df0 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame2==0 || pName
16e00 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  2->z==0 ){.    p
16e10 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
16e20 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62  ndCollSeq(db, db
16e30 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a  ->enc, pName1->z
16e40 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b  , pName1->n, 0);
16e50 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
16e60 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
16e70 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
16e80 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   pColl);.      r
16e90 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
16ea0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
16eb0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
16ec0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
16ed0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
16ee0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
16ef0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
16f00 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
16f10 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44  (pObjName);.  zD
16f20 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
16f30 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
16f40 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
16f50 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
16f60 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
16f70 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
16f80 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
16f90 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
16fa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16fb0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
16fc0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
16fd0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
16fe0 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69  liteFree(z);.  i
16ff0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
17000 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
17010 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
17020 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
17030 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
17040 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
17050 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
17060 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
17070 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17080 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
17090 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
170a0 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
170b0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a        d");.}.#endif.