/ Hex Artifact Content
Login

Artifact 62a286c8b1f4084a5e5abb0e3bd5434444c08de6:


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 34 39 20 32 30 30 35 2f 30 39 2f 31 35  1.349 2005/09/15
02f0: 20 32 31 3a 32 34 3a 35 32 20 64 72 68 20 45 78   21:24:52 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: 69 3c 32 35 35 20 3f 20 69 2b 31 20 3a 20 32 35  i<255 ? i+1 : 25
8020: 35 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  5;.      }.    }
8030: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
8040: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
8050: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
8060: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
8070: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
8080: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
8090: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
80a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
80b0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
80c0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
80d0: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
80e0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
80f0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
8100: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
8110: 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e      pTab->autoIn
8120: 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d  c = autoInc;.  }
8130: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
8140: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
8150: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
8160: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
8170: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8180: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
8190: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
81a0: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
81b0: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
81c0: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
81d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
81e0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
81f0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
8200: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
8210: 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  0, 0);.    pList
8220: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
8230: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
8240: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8250: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
8260: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
8270: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
8280: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
8290: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
82a0: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
82b0: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
82c0: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
82d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
82e0: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
82f0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
8300: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
8310: 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65   nType){.  Table
8320: 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49   *p;.  Index *pI
8330: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
8340: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Coll;.  int i;..
8350: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8360: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
8370: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
8380: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70   p->nCol-1;..  p
8390: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
83a0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
83b0: 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  se, zType, nType
83c0: 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  );.  p->aCol[i].
83d0: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a  pColl = pColl;..
83e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
83f0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
8400: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
8410: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
8420: 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e  ype>",.  ** then
8430: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
8440: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
8450: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
8460: 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  efore the.  ** c
8470: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
8480: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
8490: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
84a0: 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  he case..  */.  
84b0: 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49  for(pIdx = p->pI
84c0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
84d0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
84e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
84f0: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
8500: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
8510: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49  olumn[0]==i ) pI
8520: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
8530: 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[0] = pColl;.  
8540: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  }.}../*.** Call 
8550: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
8560: 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f  Seq() for all co
8570: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8580: 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  s in an index,.*
8590: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65  * in order to ve
85a0: 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 74 68  rify that all th
85b0: 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6c 6c  e necessary coll
85c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
85d0: 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a  are.** loaded..*
85e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
85f0: 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50  ckIndexCollSeq(P
8600: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
8610: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66  dex *pIdx){.  if
8620: 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e  ( pIdx ){.    in
8630: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
8640: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
8650: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
8660: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
8670: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8680: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
8690: 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  ll[i]) ){.      
86a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
86b0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
86c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
86d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
86e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
86f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
8700: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8710: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
8720: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
8730: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
8740: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
8750: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
8760: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
8770: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
8780: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8790: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
87a0: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
87b0: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
87c0: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
87d0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
87e0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
87f0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
8800: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
8810: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
8820: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
8830: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
8840: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
8850: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
8860: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
8870: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
8880: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
8890: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
88a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
88b0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
88c0: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
88d0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
88e0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
88f0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
8900: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
8910: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
8920: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
8930: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
8940: 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  se..*/.CollSeq *
8950: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
8960: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
8970: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
8980: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
8990: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
89a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
89b0: 20 75 38 20 65 6e 63 20 3d 20 64 62 2d 3e 65 6e   u8 enc = db->en
89c0: 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  c;.  u8 initbusy
89d0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
89e0: 3b 0a 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ;..  CollSeq *pC
89f0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
8a00: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
8a10: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
8a20: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
8a30: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
8a40: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
8a50: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
8a60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
8a70: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c  CollSeq(db, pCol
8a80: 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  l, zName, nName)
8a90: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
8aa0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e   ){.      if( nN
8ab0: 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ame<0 ){.       
8ac0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
8ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
8ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8af0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
8b00: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
8b10: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
8b20: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  , nName, zName);
8b30: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  .      pColl = 0
8b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
8b50: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
8b60: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8b70: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
8b80: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
8b90: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
8ba0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
8bb0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
8bc0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
8bd0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
8be0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
8bf0: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
8c00: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
8c10: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
8c20: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
8c30: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
8c40: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
8c50: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
8c60: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
8c70: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
8c80: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
8c90: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
8ca0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
8cb0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
8cc0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
8cd0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
8ce0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
8cf0: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
8d00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
8d10: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
8d20: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
8d30: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
8d40: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
8d50: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
8d60: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
8d70: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
8d80: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
8d90: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
8da0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
8db0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
8dc0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
8dd0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
8de0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
8df0: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
8e00: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
8e10: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
8e20: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
8e30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
8e40: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
8e50: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c  e3 *db, Vdbe *v,
8e60: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
8e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8e80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
8e90: 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
8ea0: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20  _cookie+1, 0);. 
8eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ec0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
8ed0: 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f  e, iDb, 0);.}../
8ee0: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
8ef0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
8f00: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
8f10: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
8f20: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
8f30: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
8f40: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
8f50: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
8f60: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
8f70: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
8f80: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
8f90: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
8fa0: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
8fb0: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
8fc0: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
8fd0: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
8fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8ff0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
9000: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
9010: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
9020: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
9030: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
9040: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
9050: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
9060: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69  /*.** Write an i
9070: 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74  dentifier onto t
9080: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69  he end of the gi
9090: 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64  ven string.  Add
90a0: 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63  .** quote charac
90b0: 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a  ters as needed..
90c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
90d0: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
90e0: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
90f0: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
9100: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9110: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
9120: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
9130: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
9140: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
9150: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
9160: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
9170: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
9180: 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74   !isalnum(zIdent
9190: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
91a0: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
91b0: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
91c0: 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20  =  zIdent[j]!=0 
91d0: 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e  || isdigit(zIden
91e0: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
91f0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
9200: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
9210: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b  dent, j)!=TK_ID;
9220: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9230: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9240: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
9250: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
9260: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
9270: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
9280: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
9290: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
92a0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
92b0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
92c0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
92d0: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
92e0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
92f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9300: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
9310: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
9320: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
9330: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
9340: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
9350: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
9360: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
9370: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
9380: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
9390: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
93a0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
93b0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
93c0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
93d0: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
93e0: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
93f0: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
9400: 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75  zEnd, *z;.  Colu
9410: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
9420: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
9430: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
9440: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
9450: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
9460: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
9470: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  ->zName);.    z 
9480: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
9490: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
94a0: 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a    n += (strlen(z
94b0: 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ) + 1);.    }.  
94c0: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
94d0: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
94e0: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20    if( n<50 ){.  
94f0: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
9500: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
9510: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
9520: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
9530: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
9540: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
9550: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
9560: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
9570: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
9580: 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
9590: 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66  ocRaw( n );.  if
95a0: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
95b0: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
95c0: 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d  zStmt, !OMIT_TEM
95d0: 50 44 42 26 26 70 2d 3e 69 44 62 3d 3d 31 20 3f  PDB&&p->iDb==1 ?
95e0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
95f0: 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54 41  BLE ":"CREATE TA
9600: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
9610: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
9620: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
9630: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
9640: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
9650: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
9660: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
9670: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
9680: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
9690: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
96a0: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
96b0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
96c0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
96d0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
96e0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
96f0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
9700: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
9710: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
9720: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
9730: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
9740: 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b  [k], z);.      k
9750: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20   += strlen(z);. 
9760: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70     }.  }.  strcp
9770: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
9780: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
9790: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
97a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
97b0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
97c0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
97d0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
97e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
97f0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
9800: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
9810: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
9820: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
9830: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
9840: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
9850: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
9860: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
9870: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
9880: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
9890: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
98a0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
98b0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
98c0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
98d0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
98e0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
98f0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
9900: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
9910: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
9920: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
9930: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9940: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9950: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
9960: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
9970: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9980: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
9990: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
99a0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
99b0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
99c0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
99d0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
99e0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
99f0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
9a00: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
9a10: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
9a20: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
9a30: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
9a40: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
9a50: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
9a60: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
9a70: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
9a80: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
9a90: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
9aa0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
9ab0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
9ac0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
9ad0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
9ae0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
9af0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
9b00: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
9b10: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
9b20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9b30: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
9b40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9b50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
9b60: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
9b70: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
9b80: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
9b90: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
9ba0: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
9bb0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9bd0: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
9be0: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
9bf0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
9c00: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
9c10: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
9c20: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
9c30: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
9c40: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9c50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9c60: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
9c70: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
9c80: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
9c90: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
9ca0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
9cb0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  d ) return;.  p 
9cc0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9cd0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9ce0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
9cf0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
9d00: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
9d10: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9d20: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
9d30: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
9d40: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
9d50: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
9d60: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
9d70: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
9d80: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
9d90: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
9da0: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
9db0: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
9dc0: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
9dd0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
9de0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
9df0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
9e00: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
9e10: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
9e20: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
9e30: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
9e40: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
9e50: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
9e60: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
9e70: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
9e80: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
9e90: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
9ea0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
9eb0: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
9ec0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
9ed0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
9ee0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
9ef0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
9f00: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
9f10: 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63  tabase.  The rec
9f20: 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ord number.  ** 
9f30: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
9f40: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61  e entry should a
9f50: 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65  lready be on the
9f60: 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
9f70: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
9f80: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
9f90: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
9fa0: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
9fb0: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
9fc0: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
9fd0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
9fe0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
9ff0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
a000: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
a010: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
a020: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
a030: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
a040: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
a050: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
a060: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
a070: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
a080: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
a090: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
a0a0: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
a0b0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
a0c0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
a0d0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a0e0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
a0f0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
a100: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a110: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
a120: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
a130: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
a140: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e  the new table an
a150: 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74  d push it onto t
a160: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
a170: 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72   A view has no r
a180: 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74  ootpage, so just
a190: 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74   push a zero ont
a1a0: 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a  o the stack for.
a1b0: 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49      ** views.  I
a1c0: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
a1d0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
a1e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a1f0: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
a200: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
a210: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
a220: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
a230: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
a240: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
a250: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a260: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
a270: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
a280: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
a290: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
a2a0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
a2b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
a2c0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
a2d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a2e0: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
a2f0: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
a300: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
a310: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
a320: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
a330: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
a340: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
a350: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
a360: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
a370: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
a380: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
a390: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
a3a0: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
a3b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
a3c0: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
a3d0: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
a3e0: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
a3f0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
a400: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
a410: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
a420: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
a430: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
a440: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61  lect ){.      Ta
a450: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
a460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a470: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a480: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a4a0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
a4b0: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
a4c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a4d0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
a4e0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
a4f0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
a500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
a510: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
a520: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
a530: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
a540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a550: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a560: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
a570: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
a580: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
a590: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
a5a0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
a5b0: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
a5c0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
a5d0: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
a5e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a5f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
a600: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
a610: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
a620: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
a630: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
a640: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
a650: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
a660: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
a670: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
a680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
a690: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
a6a0: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
a6b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
a6c0: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
a6d0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
a6e0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
a6f0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
a700: 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
a710: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
a720: 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  mt(p);.    }else
a730: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64  {.      n = pEnd
a740: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
a750: 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a  ameToken.z + 1;.
a760: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
a770: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52  lite3MPrintf("CR
a780: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
a790: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
a7a0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
a7b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
a7c0: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
a7d0: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
a7e0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
a7f0: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
a800: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
a810: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
a820: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
a830: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
a840: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
a850: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
a860: 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69  ected.  The rowi
a870: 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c  d for the preall
a880: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c  ocated.    ** sl
a890: 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74  ot is the 2nd it
a8a0: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
a8b0: 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65    The top of the
a8c0: 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20   stack is the.  
a8d0: 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66    ** root page f
a8e0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
a8f0: 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73   (or a 0 if this
a900: 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20   is a view)..   
a910: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
a920: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
a930: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
a940: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
a950: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
a960: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
a970: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
a980: 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  =#0, sql=%Q ".  
a990: 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
a9a0: 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d  d=#1",.      db-
a9b0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61  >aDb[p->iDb].zNa
a9c0: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
a9d0: 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20 20  (p->iDb),.      
a9e0: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
a9f0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
aa00: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74  zName,.      zSt
aa10: 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
aa20: 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b  liteFree(zStmt);
aa30: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
aa40: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
aa50: 70 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  p->iDb);..#ifnde
aa60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
aa70: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
aa80: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
aa90: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
aaa0: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
aab0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
aac0: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
aad0: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
aae0: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
aaf0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
ab00: 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20  autoInc ){.     
ab10: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
ab20: 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20  aDb[p->iDb];.   
ab30: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 65 71     if( pDb->pSeq
ab40: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
ab50: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
ab60: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
ab70: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
ab80: 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
ab90: 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
aba0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
abb0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  b->zName.       
abc0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
abd0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
abe0: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
abf0: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
ac00: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
ac10: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
ac20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ac30: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
ac40: 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a 20  ma, p->iDb, 0,. 
ac50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
ac60: 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d  rintf("tbl_name=
ac70: 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c  '%q'",p->zName),
ac80: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
ac90: 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
aca0: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
acb0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
acc0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
acd0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
ace0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
acf0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
ad00: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
ad10: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79   *pOld;.    FKey
ad20: 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44 62   *pFKey; .    Db
ad30: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
ad40: 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f  [p->iDb];.    pO
ad50: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
ad60: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c  Insert(&pDb->tbl
ad70: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
ad80: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
ad90: 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  +1, p);.    if( 
ada0: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
adb0: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
adc0: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
add0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
ade0: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
adf0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
ae00: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
ae10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
ae20: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28  IGN_KEY.    for(
ae30: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
ae40: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
ae50: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
ae60: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
ae70: 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54  strlen(pFKey->zT
ae80: 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46  o) + 1;.      pF
ae90: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73  Key->pNextTo = s
aea0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
aeb0: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  pDb->aFKey, pFKe
aec0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
aed0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
aee0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
aef0: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
af00: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
af10: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
af20: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
af30: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
af40: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
af50: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
af60: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69  ternChanges;..#i
af70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af80: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
af90: 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
afa0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
afb0: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
afc0: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
afd0: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
afe0: 7a 3d 3d 30 20 29 20 70 43 6f 6e 73 20 3d 20 70  z==0 ) pCons = p
aff0: 45 6e 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  End;.      p->ad
b000: 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
b010: 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20 2d 20 70 50  + (pCons->z - pP
b020: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
b030: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  .z);.    }.#endi
b040: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
b050: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
b060: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
b070: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
b080: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
b090: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
b0a0: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
b0b0: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
b0c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b0d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
b0e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b0f0: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
b100: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
b110: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
b120: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
b130: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
b140: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
b150: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
b160: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b170: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
b180: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
b190: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
b1a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
b1b0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
b1c0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
b1d0: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
b1e0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
b1f0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
b200: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
b210: 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f  isTemp         /
b220: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
b230: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29  PORARY view */.)
b240: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
b250: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75  int n;.  const u
b260: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
b270: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
b280: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
b290: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a   Token *pName;..
b2a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
b2b0: 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
b2c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b2d0: 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
b2e0: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
b2f0: 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
b300: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
b310: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
b320: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b330: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
b340: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
b350: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
b360: 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20  , isTemp, 1);.  
b370: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b380: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
b390: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
b3a0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b3b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b3c0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
b3d0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
b3e0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
b3f0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
b400: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
b410: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
b420: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
b430: 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c   p->iDb, "view",
b440: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
b450: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
b460: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
b470: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
b480: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b490: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
b4a0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
b4b0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
b4c0: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
b4d0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
b4e0: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
b4f0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
b500: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
b510: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
b520: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
b530: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
b540: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
b550: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
b560: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
b570: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
b580: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
b590: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
b5a0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
b5b0: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
b5c0: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
b5d0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
b5e0: 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  tDup(pSelect);. 
b5f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b600: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b610: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
b620: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
b630: 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65     sqlite3ViewGe
b640: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
b650: 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20  rse, p);.  }..  
b660: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
b670: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
b680: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
b690: 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
b6a0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
b6b0: 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
b6c0: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
b6d0: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
b6e0: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
b6f0: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
b700: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
b710: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
b720: 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a   0;.  n = sEnd.z
b730: 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   - pBegin->z;.  
b740: 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  z = (const unsig
b750: 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e  ned char*)pBegin
b760: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e  ->z;.  while( n>
b770: 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b  0 && (z[n-1]==';
b780: 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e  ' || isspace(z[n
b790: 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  -1])) ){ n--; }.
b7a0: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
b7b0: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
b7c0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
b7d0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
b7e0: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
b7f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
b800: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
b810: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
b820: 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
b830: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
b840: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b850: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
b860: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b870: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
b880: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
b890: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
b8a0: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
b8b0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
b8c0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
b8d0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
b8e0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
b8f0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
b900: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
b910: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
b920: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
b930: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b940: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
b950: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
b960: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
b970: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
b980: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
b990: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
b9a0: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
b9b0: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
b9c0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
b9d0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
b9e0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
b9f0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
ba00: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
ba10: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
ba20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
ba30: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
ba40: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
ba50: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
ba60: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
ba70: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
ba80: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
ba90: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
baa0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
bab0: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a   pTable );..  /*
bac0: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
bad0: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
bae0: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
baf0: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
bb00: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
bb10: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
bb20: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
bb30: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
bb40: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
bb50: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
bb60: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
bb70: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
bb80: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
bb90: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
bba0: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
bbb0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
bbc0: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
bbd0: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
bbe0: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
bbf0: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
bc00: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
bc10: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
bc20: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
bc30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
bc40: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
bc50: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
bc60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
bc70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
bc80: 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20  lly, this error 
bc90: 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f  is caught previo
bca0: 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20  usly and so the 
bcb0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20  following test. 
bcc0: 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   ** should alway
bcd0: 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20  s fail.  But we 
bce0: 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e  will leave it in
bcf0: 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62   place just to b
bd00: 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 23 69 66  e safe..  */.#if
bd10: 20 30 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d   0.  if( pTable-
bd20: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
bd30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bd40: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
bd50: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
bd60: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
bd70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
bd80: 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 1;.  }.#endif
bd90: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
bda0: 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20  e->nCol>=0 );.. 
bdb0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
bdc0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
bdd0: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
bde0: 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
bdf0: 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74  mes..  ** Note t
be00: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
be10: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
be20: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
be30: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
be40: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
be50: 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20  the results set 
be60: 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20  of the view and 
be70: 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73  will assign curs
be80: 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ors.  ** to the 
be90: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
bea0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75  FROM clause.  Bu
beb0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  t we do not want
bec0: 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20   these changes. 
bed0: 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e   ** to be perman
bee0: 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d  ent.  So the com
bef0: 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65  putation is done
bf00: 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68   on a copy of th
bf10: 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74  e SELECT.  ** st
bf20: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
bf30: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
bf40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
bf50: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
bf60: 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65  .  pSel = sqlite
bf70: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c  3SelectDup(pTabl
bf80: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e  e->pSelect);.  n
bf90: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
bfa0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
bfb0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
bfc0: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
bfd0: 63 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  c);.  pTable->nC
bfe0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54  ol = -1;.  pSelT
bff0: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
c000: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
c010: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a  arse, 0, pSel);.
c020: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
c030: 20 6e 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61   n;.  if( pSelTa
c040: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c050: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
c060: 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   );.    pTable->
c070: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
c080: 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65  nCol;.    pTable
c090: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
c0a0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c  ->aCol;.    pSel
c0b0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
c0c0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
c0d0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
c0e0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
c0f0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62  pSelTab);.    Db
c100: 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72  SetProperty(pPar
c110: 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e  se->db, pTable->
c120: 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  iDb, DB_UnresetV
c130: 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iews);.  }else{.
c140: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
c150: 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b   = 0;.    nErr++
c160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
c170: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c180: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  );.  return nErr
c190: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
c1a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c1b0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
c1c0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
c1d0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
c1e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
c1f0: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
c200: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
c210: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
c220: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
c230: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
c240: 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
c250: 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73  *i;.  if( !DbHas
c260: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
c270: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
c280: 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
c290: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
c2a0: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
c2b0: 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  x].tblHash); i; 
c2c0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
c2d0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
c2e0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c2f0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
c300: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
c310: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c320: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
c330: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
c340: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
c350: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
c360: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
c370: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
c380: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
c390: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
c3a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c3b0: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
c3c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
c3d0: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
c3e0: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
c3f0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
c400: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
c410: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
c420: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
c430: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
c440: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
c450: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
c460: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
c470: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
c480: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
c490: 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   iTo..*/.#ifndef
c4a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c4b0: 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
c4c0: 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
c4d0: 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69  d(Db *pDb, int i
c4e0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
c4f0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
c500: 6d 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65  m;.  .  for(pEle
c510: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
c520: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29  t(&pDb->tblHash)
c530: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
c540: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
c550: 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
c560: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c570: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
c580: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
c590: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
c5a0: 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
c5b0: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
c5c0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  n;.    }.  }.  f
c5d0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
c5e0: 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69  ashFirst(&pDb->i
c5f0: 64 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  dxHash); pElem; 
c600: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
c610: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
c620: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
c630: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
c640: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
c650: 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
c660: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
c670: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
c680: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c690: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b    }.  assert(0);
c6a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c6b0: 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
c6c0: 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
c6d0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
c6e0: 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
c6f0: 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
c700: 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
c710: 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
c720: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
c730: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
c740: 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
c750: 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
c760: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
c770: 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
c780: 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
c790: 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
c7a0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
c7b0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
c7c0: 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
c7d0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
c7e0: 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
c7f0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
c800: 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
c810: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c820: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c830: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c840: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
c850: 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29  oy, iTable, iDb)
c860: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c870: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c880: 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
c890: 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67   pushes an integ
c8a0: 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  er onto the stac
c8b0: 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  k. If this integ
c8c0: 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
c8d0: 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
c8e0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
c8f0: 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
c900: 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
c910: 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
c920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
c930: 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
c940: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
c950: 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
c960: 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
c970: 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20 74  ** The "#0" in t
c980: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
c990: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
c9a0: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
c9b0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f   value.  ** is o
c9c0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
c9d0: 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c   stack.  See sql
c9e0: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
c9f0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
ca00: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
ca10: 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
ca20: 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
ca30: 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
ca40: 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  #0 AND rootpage=
ca50: 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  #0",.     pParse
ca60: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
ca70: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
ca80: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29  LE(iDb), iTable)
ca90: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
caa0: 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64  * Write VDBE cod
cab0: 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65  e to erase table
cac0: 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73   pTab and all as
cad0: 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73  sociated indices
cae0: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64   on disk..** Cod
caf0: 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
cb00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
cb10: 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61  bles and interna
cb20: 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74  l schema definit
cb30: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20  ions.** in case 
cb40: 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f  a root-page belo
cb50: 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72  nging to another
cb60: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
cb70: 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  by the btree lay
cb80: 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64  er.** is also ad
cb90: 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61  ded (this can ha
cba0: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
cbb0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
cbc0: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e)..*/.static vo
cbd0: 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28  id destroyTable(
cbe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
cbf0: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66  able *pTab){.#if
cc00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc10: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64  AUTOVACUUM.  Ind
cc20: 65 78 20 2a 70 49 64 78 3b 0a 20 20 64 65 73 74  ex *pIdx;.  dest
cc30: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
cc40: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
cc50: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f  pTab->iDb);.  fo
cc60: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
cc70: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
cc80: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
cc90: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
cca0: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
ccb0: 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29  tnum, pIdx->iDb)
ccc0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
ccd0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
cce0: 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
ccf0: 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
cd00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cd10: 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
cd20: 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
cd30: 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
cd40: 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
cd50: 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
cd60: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
cd70: 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
cd80: 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
cd90: 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
cda0: 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
cdb0: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
cdc0: 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
cdd0: 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
cde0: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
cdf0: 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
ce00: 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
ce10: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
ce20: 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
ce30: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
ce40: 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
ce50: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
ce60: 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
ce70: 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
ce80: 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
ce90: 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
cea0: 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
ceb0: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
cec0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
ced0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
cee0: 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
cef0: 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
cf00: 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
cf10: 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
cf20: 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
cf30: 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
cf40: 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
cf50: 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
cf60: 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
cf70: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
cf80: 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
cf90: 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
cfa0: 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
cfb0: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
cfc0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
cfd0: 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
cfe0: 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
cff0: 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
d000: 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
d010: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
d020: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
d030: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
d040: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
d050: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
d060: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
d070: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
d080: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
d090: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b  Db==pTab->iDb );
d0a0: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
d0b0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
d0c0: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
d0d0: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
d0e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
d0f0: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
d100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d110: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
d120: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 65 73   return;.    des
d130: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
d140: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 70  rse, iLargest, p
d150: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69  Tab->iDb);.    i
d160: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
d170: 67 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gest;.  }.#endif
d180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d190: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d1a0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
d1b0: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
d1c0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
d1d0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
d1e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
d1f0: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
d200: 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
d210: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
d220: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
d230: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  me, int isView){
d240: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
d250: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
d260: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d270: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
d280: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
d290: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
d2a0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
d2b0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
d2c0: 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  table;.  assert(
d2d0: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
d2e0: 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
d2f0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
d300: 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
d310: 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
d320: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
d330: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
d340: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
d350: 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d  p_table;.  iDb =
d360: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73   pTab->iDb;.  as
d370: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
d380: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23  iDb<db->nDb );.#
d390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d3a0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
d3b0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
d3c0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
d3d0: 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
d3e0: 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62  _TABLE(pTab->iDb
d3f0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
d400: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
d410: 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  [pTab->iDb].zNam
d420: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
d430: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
d440: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
d450: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
d460: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
d470: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
d480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
d490: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
d4a0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
d4b0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
d4c0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
d4d0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
d4e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d4f0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
d500: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
d510: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d520: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
d530: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
d540: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
d550: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
d560: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
d570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d580: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
d590: 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
d5a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d5b0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
d5c0: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
d5d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
d5e0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
d5f0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
d600: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
d610: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
d620: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
d630: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
d640: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
d650: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
d660: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
d670: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
d680: 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
d690: 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62  Only || pTab==db
d6a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54  ->aDb[iDb].pSeqT
d6b0: 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
d6c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d6d0: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
d6e0: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
d6f0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
d700: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
d710: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
d720: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d730: 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
d740: 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
d750: 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
d760: 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
d770: 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
d780: 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
d790: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
d7a0: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
d7b0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
d7c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d7d0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
d7e0: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
d7f0: 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
d800: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
d810: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
d820: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
d830: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
d840: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
d850: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d860: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
d870: 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
d880: 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
d890: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
d8a0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
d8b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
d8c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d8d0: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
d8e0: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
d8f0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
d900: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
d910: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d920: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d930: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
d940: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 69  *pTrigger;.    i
d950: 6e 74 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  nt iDb = pTab->i
d960: 44 62 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  Db;.    Db *pDb 
d970: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
d980: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
d990: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
d9a0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
d9b0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
d9c0: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
d9d0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
d9e0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
d9f0: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
da00: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
da10: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
da20: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
da30: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
da40: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
da50: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
da60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
da70: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
da80: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
da90: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
daa0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
dab0: 67 65 72 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c  ger->iDb==iDb ||
dac0: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
dad0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
dae0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
daf0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
db00: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54 72  r, 1);.      pTr
db10: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
db20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
db30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
db40: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
db50: 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
db60: 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
db70: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
db80: 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
db90: 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
dba0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
dbb0: 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
dbc0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
dbd0: 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
dbe0: 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
dbf0: 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
dc00: 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
dc10: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
dc20: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
dc30: 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
dc40: 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
dc50: 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
dc60: 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
dc70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
dc80: 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  b->autoInc ){.  
dc90: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
dca0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
dcb0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
dcc0: 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
dcd0: 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
dce0: 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
dcf0: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
dd00: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
dd10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
dd20: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
dd30: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
dd40: 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
dd50: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
dd60: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
dd70: 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
dd80: 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
dd90: 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
dda0: 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
ddb0: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
ddc0: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
ddd0: 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
dde0: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
ddf0: 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
de00: 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
de10: 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
de20: 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
de30: 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
de40: 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
de50: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
de60: 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
de70: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
de80: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
de90: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
dea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
deb0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
dec0: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
ded0: 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
dee0: 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
def0: 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
df00: 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  '",.        pDb-
df10: 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
df20: 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
df30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
df40: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
df50: 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
df60: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
df70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
df80: 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  ve the table ent
df90: 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73  ry from SQLite's
dfa0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
dfb0: 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20   and modify.    
dfc0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
dfd0: 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  okie..    */.   
dfe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
dff0: 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
e000: 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a   iDb, 0, pTab->z
e010: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
e020: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
e030: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20  e(db, v, iDb);. 
e040: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
e050: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
e060: 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
e070: 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
e080: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
e090: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e0a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e0b0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
e0c0: 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
e0d0: 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
e0e0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
e0f0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
e100: 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
e110: 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
e120: 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
e130: 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
e140: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
e150: 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
e160: 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
e170: 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
e180: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
e190: 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
e1a0: 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
e1b0: 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
e1c0: 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20   to.  pToCol is 
e1d0: 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
e1e0: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   in the other.**
e1f0: 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20   pTo table that 
e200: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
e210: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67  points to.  flag
e220: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
e230: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
e240: 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
e250: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
e260: 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
e270: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
e280: 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
e290: 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
e2a0: 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
e2b0: 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
e2c0: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
e2d0: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
e2e0: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
e2f0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
e300: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
e310: 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
e320: 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a    The new FKey.*
e330: 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20  * is not linked 
e340: 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61  into db->aFKey a
e350: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74  t this point - t
e360: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  hat does not hap
e370: 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c  pen.** until sql
e380: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
e390: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
e3a0: 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
e3b0: 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
e3c0: 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
e3d0: 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
e3e0: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
e3f0: 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
e400: 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
e410: 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
e420: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
e430: 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
e440: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e450: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e460: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e470: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
e480: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
e490: 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
e4a0: 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
e4b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
e4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
e4d0: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
e4e0: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
e4f0: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
e500: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
e510: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
e520: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
e530: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
e540: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
e550: 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
e560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e570: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
e580: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
e590: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  0;.  Table *p = 
e5a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
e5b0: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
e5c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
e5d0: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
e5e0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
e5f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
e600: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
e610: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
e620: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
e630: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
e640: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
e650: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67    if( iCol<0 ) g
e660: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
e670: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
e680: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
e690: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
e6a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e6b0: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
e6c0: 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
e6d0: 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
e6e0: 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
e6f0: 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
e700: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
e710: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
e720: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
e730: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
e740: 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
e750: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
e760: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
e770: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
e780: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e790: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
e7a0: 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
e7b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
e7c0: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
e7d0: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
e7e0: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
e7f0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
e800: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
e810: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
e820: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
e830: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
e840: 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
e850: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
e860: 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
e870: 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
e880: 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
e890: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
e8a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e8b0: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
e8c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
e8d0: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
e8e0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
e8f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
e900: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
e910: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
e920: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
e930: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
e940: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
e950: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
e960: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
e970: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
e980: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
e990: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
e9a0: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
e9b0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
e9c0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
e9d0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
e9e0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
e9f0: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
ea00: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
ea10: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
ea20: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
ea30: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
ea40: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
ea50: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
ea60: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
ea70: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
ea80: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
ea90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
eaa0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
eab0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
eac0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
ead0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
eae0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
eaf0: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
eb00: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
eb10: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
eb20: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
eb30: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
eb40: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
eb50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
eb60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
eb70: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
eb80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
eba0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
ebb0: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
ebc0: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
ebd0: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
ebe0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
ebf0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
ec00: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
ec10: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
ec20: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
ec30: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
ec40: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ec50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
ec60: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
ec70: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
ec80: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
ec90: 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
eca0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
ecb0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
ecc0: 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
ecd0: 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
ece0: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
ecf0: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
ed00: 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
ed10: 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61  deleteConf = fla
ed20: 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b  gs & 0xff;.  pFK
ed30: 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d  ey->updateConf =
ed40: 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26   (flags >> 8 ) &
ed50: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
ed60: 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c  insertConf = (fl
ed70: 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78  ags >> 16 ) & 0x
ed80: 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  ff;..  /* Link t
ed90: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
eda0: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
edb0: 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
edc0: 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
edd0: 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
ede0: 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
edf0: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
ee00: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
ee10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ee20: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
ee30: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
ee40: 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f  stDelete(pFromCo
ee50: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
ee60: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43  rListDelete(pToC
ee70: 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
ee80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ee90: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
eea0: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
eeb0: 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
eec0: 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
eed0: 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
eee0: 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
eef0: 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
ef00: 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
ef10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
ef20: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
ef30: 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
ef40: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
ef50: 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
ef60: 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
ef70: 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
ef80: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
ef90: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
efa0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
efb0: 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
efc0: 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
efd0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
efe0: 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
eff0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
f000: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
f010: 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
f020: 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
f030: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
f040: 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
f050: 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
f060: 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
f070: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
f080: 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72  erred = isDeferr
f090: 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
f0a0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f0b0: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
f0c0: 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
f0d0: 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
f0e0: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
f0f0: 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
f100: 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
f110: 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
f120: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
f130: 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
f140: 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
f150: 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
f160: 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
f170: 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
f180: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
f190: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
f1a0: 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
f1b0: 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  The memory cell 
f1c0: 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
f1d0: 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
f1e0: 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
f1f0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
f200: 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
f210: 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
f220: 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
f230: 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
f240: 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
f250: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
f260: 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
f270: 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
f280: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
f290: 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
f2a0: 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
f2b0: 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
f2c0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
f2d0: 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
f2e0: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
f2f0: 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
f300: 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
f310: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
f320: 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
f330: 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
f340: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
f350: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
f360: 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  b;       /* Btre
f370: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
f380: 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
f390: 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
f3a0: 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74  Tab+1;     /* Bt
f3b0: 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
f3c0: 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
f3d0: 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3f0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
f400: 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
f410: 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f430: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
f440: 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
f470: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
f480: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
f490: 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
f4a0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
f4b0: 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
f4c0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f4d0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
f4e0: 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
f4f0: 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70  Name, 0,.      p
f500: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 70  Parse->db->aDb[p
f510: 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Index->iDb].zNam
f520: 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
f530: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
f540: 20 2f 2a 20 45 6e 73 75 72 65 20 61 6c 6c 20 74   /* Ensure all t
f550: 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 6c  he required coll
f560: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
f570: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  are available. T
f580: 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  his.  ** routine
f590: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
f5a0: 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65   collation-neede
f5b0: 64 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 6e 65  d callback if ne
f5c0: 63 65 73 73 61 72 79 20 28 61 6e 64 0a 20 20 2a  cessary (and.  *
f5d0: 2a 20 69 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * if one has bee
f5e0: 6e 20 72 65 67 69 73 74 65 72 65 64 29 2e 0a 20  n registered).. 
f5f0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
f600: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
f610: 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  eq(pParse, pInde
f620: 78 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  x) ){.    return
f630: 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
f640: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f650: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
f660: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f670: 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
f680: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
f6a0: 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67  Load, memRootPag
f6b0: 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20  e, 0);.    tnum 
f6c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
f6d0: 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
f6e0: 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >tnum;.    sqlit
f6f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f700: 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70  P_Clear, tnum, p
f710: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d  Index->iDb);.  }
f720: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f730: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
f740: 72 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20  r, pIndex->iDb, 
f750: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
f760: 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  eOp3(v, OP_OpenW
f770: 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
f780: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f790: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49        (char*)&pI
f7a0: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50  ndex->keyInfo, P
f7b0: 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  3_KEYINFO);.  sq
f7c0: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f  lite3OpenTableFo
f7d0: 72 52 65 61 64 69 6e 67 28 76 2c 20 69 54 61 62  rReading(v, iTab
f7e0: 2c 20 70 54 61 62 29 3b 0a 20 20 61 64 64 72 31  , pTab);.  addr1
f7f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f800: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
f810: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
f820: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
f830: 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c  exKey(v, pIndex,
f840: 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70 49   iTab);.  if( pI
f850: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
f860: 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e  E_None ){.    in
f870: 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c 69  t curaddr = sqli
f880: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f890: 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 61  dr(v);.    int a
f8a0: 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b 34  ddr2 = curaddr+4
f8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f8c0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75 72  eChangeP2(v, cur
f8d0: 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b 0a  addr-1, addr2);.
f8e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f8f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
f900: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
f910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f920: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
f930: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
f940: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f950: 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c  _IsUnique, iIdx,
f960: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
f970: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
f980: 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
f990: 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41 62  ONSTRAINT, OE_Ab
f9a0: 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
f9b0: 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65           "indexe
f9c0: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  d columns are no
f9d0: 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54  t unique", P3_ST
f9e0: 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65 72  ATIC);.    asser
f9f0: 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74 65  t( addr2==sqlite
fa00: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
fa10: 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (v) );.  }.  sql
fa20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fa30: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
fa40: 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Idx, 0);.  sqlit
fa50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fa60: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
fa70: 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
fa80: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
fa90: 20 61 64 64 72 31 2c 20 73 71 6c 69 74 65 33 56   addr1, sqlite3V
faa0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
fab0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
fac0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
fad0: 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  se, iTab, 0);.  
fae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
faf0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
fb00: 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx, 0);.}../*.**
fb10: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
fb20: 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
fb30: 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
fb40: 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
fb50: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
fb60: 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
fb70: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
fb80: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
fb90: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
fba0: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
fbb0: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
fbc0: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
fbd0: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
fbe0: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
fbf0: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
fc00: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
fc10: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
fc20: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
fc30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
fc40: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
fc50: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
fc60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
fc70: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
fc80: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
fc90: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
fca0: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
fcb0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
fcc0: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
fcd0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
fce0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
fcf0: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
fd00: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
fd10: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
fd20: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
fd30: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
fd40: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
fd50: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
fd60: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
fd70: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
fd80: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
fd90: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
fda0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
fdb0: 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
fdc0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
fdd0: 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
fde0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
fdf0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
fe00: 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
fe10: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
fe20: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
fe30: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
fe40: 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
fe50: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
fe60: 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
fe70: 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
fe80: 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
fe90: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
fea0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
feb0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
fec0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
fed0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
fee0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
fef0: 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
ff00: 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
ff10: 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
ff20: 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
ff30: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
ff40: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
ff50: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
ff60: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
ff70: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
ff80: 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 54  pEnd        /* T
ff90: 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
ffa0: 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
ffb0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
ffc0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
ffd0: 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c  b = 0;   /* Tabl
ffe0: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
fff0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
10000 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69  ex = 0; /* The i
10010 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
10020 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
10030 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
10040 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
10050 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
10060 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
10070 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
10080 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
10090 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
100a0 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
100b0 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
100c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
100d0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74  arse->db;..  int
100e0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f   iDb;          /
100f0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
10100 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
10110 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
10120 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
10130 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66  = 0; /* Unqualif
10140 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
10150 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
10160 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
10170 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
10180 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
10190 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
101a0 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a  te_index;..  /*.
101b0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
101c0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
101d0 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
101e0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
101f0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
10200 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
10210 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
10220 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
10230 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
10240 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
10250 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
10260 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
10270 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
10280 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
10290 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
102a0 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
102b0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
102c0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
102d0 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
102e0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
102f0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
10300 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
10310 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
10320 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
10330 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10340 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10350 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
10360 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
10370 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
10380 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
10390 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
103a0 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
103b0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
103c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
103d0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
103e0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
103f0 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
10400 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
10410 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
10420 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
10430 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44  pTab && pTab->iD
10440 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44  b==1 ){.      iD
10450 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  b = 1;.    }.#en
10460 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
10470 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
10480 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
10490 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
104a0 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
104b0 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
104c0 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
104d0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
104e0 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
104f0 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
10500 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
10510 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
10520 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
10530 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
10540 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
10550 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
10560 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
10570 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
10580 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  e(pParse, pTblNa
10590 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
105a0 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d  .        pTblNam
105b0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
105c0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  e);.    if( !pTa
105d0 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
105e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
105f0 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61  assert( iDb==pTa
10600 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73  b->iDb );.  }els
10610 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
10620 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
10630 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
10640 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44  NewTable;.    iD
10650 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
10660 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   }..  if( pTab==
10670 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
10680 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
10690 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
106a0 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
106b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
106c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
106d0 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
106e0 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
106f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
10700 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10710 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
10720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10730 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
10740 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
10750 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10760 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
10770 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
10780 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
10790 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
107a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
107b0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
107c0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
107d0 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
107e0 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
107f0 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
10800 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
10810 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
10820 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
10830 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
10840 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
10850 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
10860 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
10870 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
10880 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
10890 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
108a0 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
108b0 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
108c0 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
108d0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
108e0 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
108f0 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
10900 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
10910 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
10920 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
10930 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
10940 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
10950 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
10960 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
10970 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
10980 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
10990 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
109a0 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
109b0 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
109c0 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
109d0 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
109e0 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
109f0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
10a00 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  en(pName);.    i
10a10 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
10a20 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
10a30 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
10a40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10a50 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
10a60 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
10a70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10a80 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10a90 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
10aa0 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
10ab0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
10ac0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10ad0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
10ae0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
10af0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
10b00 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
10b10 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
10b20 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
10b30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10b40 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10b50 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
10b60 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
10b70 62 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  b].zName)!=0 ){.
10b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10b90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10ba0 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
10bb0 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
10bc0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
10bd0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10be0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
10bf0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
10c00 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
10c10 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
10c20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10c30 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
10c40 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
10c50 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
10c60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
10c70 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10c80 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
10c90 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10ca0 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
10cb0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
10cc0 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
10cd0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
10ce0 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
10cf0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
10d00 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
10d10 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
10d20 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20  f,"_%d",n);.    
10d30 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
10d40 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
10d50 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  &zName, "sqlite_
10d60 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61  autoindex_", pTa
10d70 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20  b->zName, zBuf, 
10d80 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
10d90 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
10da0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10db0 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
10dc0 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
10dd0 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
10de0 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
10df0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10e00 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
10e10 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
10e20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
10e30 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
10e40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10e50 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10e60 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
10e70 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10e80 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
10e90 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10ea0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10eb0 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
10ec0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
10ed0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
10ee0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
10ef0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
10f00 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
10f10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
10f20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10f30 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
10f40 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
10f50 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10f60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10f70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
10f80 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
10f90 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
10fa0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
10fb0 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
10fc0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
10fd0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
10fe0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
10ff0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
11000 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
11010 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
11020 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
11030 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
11040 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
11050 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
11060 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
11070 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
11080 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
11090 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
110a0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
110b0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
110c0 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
110d0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
110e0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
110f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
11100 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
11110 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
11120 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
11130 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
11140 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
11150 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
11160 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73 69 7a  zName) + 1 + siz
11170 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20 20 20  eof(int) +.     
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a     (sizeof(int)*
111a0 32 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  2 + sizeof(CollS
111b0 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
111c0 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  pr );.  if( sqli
111d0 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
111e0 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
111f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
11200 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
11210 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e   (int*)&pIndex->
11220 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c  keyInfo.aColl[pL
11230 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70  ist->nExpr];.  p
11240 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
11250 3d 20 28 75 6e 73 69 67 6e 65 64 2a 29 26 70 49  = (unsigned*)&pI
11260 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  ndex->aiColumn[p
11270 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
11280 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
11290 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
112a0 61 69 52 6f 77 45 73 74 5b 70 4c 69 73 74 2d 3e  aiRowEst[pList->
112b0 6e 45 78 70 72 2b 31 5d 3b 0a 20 20 73 74 72 63  nExpr+1];.  strc
112c0 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
112d0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
112e0 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
112f0 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
11300 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
11310 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
11320 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
11330 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
11340 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
11350 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
11360 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
11370 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
11380 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11390 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
113a0 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
113b0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
113c0 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
113d0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
113e0 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
113f0 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
11400 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
11410 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
11420 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
11430 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  r; i++){.    for
11440 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
11450 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
11460 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11470 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
11480 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
11490 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
114a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
114b0 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
114c0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
114d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
114e0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
114f0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
11500 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
11510 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
11520 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
11530 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11540 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11550 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
11560 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
11570 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
11580 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20  a[i].pExpr ){.  
11590 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
115a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
115b0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49  Coll );.      pI
115c0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
115d0 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e  oll[i] = pList->
115e0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
115f0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
11600 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
11610 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
11620 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
11630 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ll;.    }.    as
11640 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65  sert( pIndex->ke
11650 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29  yInfo.aColl[i] )
11660 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
11670 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20  nit.busy && .   
11680 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
11690 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
116a0 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
116b0 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20  .aColl[i]) .    
116c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
116d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
116e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e  .    }.  }.  pIn
116f0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
11700 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  eld = pList->nEx
11710 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 66  pr;.  sqlite3Def
11720 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
11730 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
11740 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
11750 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
11760 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
11770 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
11780 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
11790 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
117a0 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
117b0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
117c0 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
117d0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
117e0 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
117f0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
11800 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
11810 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
11820 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
11830 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
11840 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
11850 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
11860 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
11870 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
11880 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
11890 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
118a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
118b0 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
118c0 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
118d0 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
118e0 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
118f0 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
11900 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
11910 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
11920 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
11930 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
11940 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
11950 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
11960 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
11970 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
11980 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
11990 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
119a0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
119b0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
119c0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
119d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
119e0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
119f0 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
11a00 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
11a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
11a20 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
11a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11a40 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
11a50 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
11a60 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
11a70 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
11a80 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
11a90 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
11aa0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
11ab0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
11ac0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
11ad0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
11ae0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
11af0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
11b00 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
11b10 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  l[k]!=pIndex->ke
11b20 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29  yInfo.aColl[k] )
11b30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11b40 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
11b50 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
11b60 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
11b70 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
11b80 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
11b90 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
11ba0 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
11bb0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
11bc0 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
11bd0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
11be0 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
11bf0 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
11c00 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
11c10 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
11c20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
11c30 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
11c40 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
11c50 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
11c60 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
11c70 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
11c80 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
11c90 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
11ca0 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
11cb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
11cc0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
11cd0 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
11ce0 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
11cf0 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
11d00 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
11d10 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
11d20 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
11d30 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
11d40 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
11d50 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
11d60 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
11d70 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
11d80 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
11d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11da0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
11dd0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
11de0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
11df0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11e00 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
11e10 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
11e20 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
11e30 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
11e40 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
11e50 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
11e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11e70 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11e80 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
11e90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
11ea0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
11eb0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
11ec0 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
11ed0 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
11ee0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
11ef0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
11f00 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
11f10 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
11f20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
11f30 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
11f40 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
11f50 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78  pIndex->iDb].idx
11f60 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
11f90 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
11fa0 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
11fb0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
11fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
11fd0 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
11fe0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
11ff0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f  iled */.      go
12000 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12010 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
12020 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
12030 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
12040 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
12050 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
12060 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
12070 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
12080 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12090 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
120a0 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
120b0 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
120c0 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
120d0 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
120e0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
120f0 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
12100 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
12110 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
12120 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
12130 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
12140 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
12150 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
12160 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
12170 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
12180 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
12190 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
121a0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
121b0 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
121c0 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
121d0 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
121e0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
121f0 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
12200 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
12210 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
12220 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
12230 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
12240 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
12250 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
12260 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
12270 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
12280 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
12290 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
122a0 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
122b0 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
122c0 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
122d0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
122e0 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
122f0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
12300 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
12310 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
12320 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
12330 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
12340 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
12350 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
12360 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
12370 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
12380 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
12390 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
123a0 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
123b0 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
123c0 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
123d0 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20  Mem++;..    v = 
123e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
123f0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
12400 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
12410 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
12420 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
12430 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
12440 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  he index.    */.
12450 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12460 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
12470 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
12480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12490 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
124a0 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b  eIndex, iDb, 0);
124b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
124c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
124d0 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  tore, iMem, 0);.
124e0 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
124f0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
12500 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
12510 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
12520 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
12530 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
12540 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
12550 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
12560 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
12570 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
12580 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
12590 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
125a0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
125b0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43  qlite3MPrintf("C
125c0 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
125d0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
125e0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
125f0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
12600 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20          pEnd->z 
12610 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a  - pName->z + 1,.
12620 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
12630 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12640 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
12650 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
12660 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
12670 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
12680 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
12690 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
126a0 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
126b0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
126c0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
126d0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
126e0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
126f0 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
12700 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
12710 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
12720 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
12730 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
12740 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
12750 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a  %Q,%Q,#0,%Q);",.
12760 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
12770 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
12780 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
12790 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
127a0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
127b0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
127c0 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
127d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
127e0 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
127f0 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
12800 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20  eFree(zStmt);.. 
12810 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
12820 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
12830 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
12840 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
12850 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
12860 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
12870 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
12880 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
12890 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
128a0 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
128b0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
128c0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
128d0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
128e0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
128f0 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
12900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
12910 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
12920 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20  ema, iDb, 0,.   
12930 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
12940 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22  intf("name='%q'"
12950 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
12960 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
12970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12980 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69  AddOp(v, OP_Expi
12990 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  re, 0, 0);.    }
129a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
129b0 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
129c0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
129d0 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
129e0 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
129f0 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
12a00 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
12a10 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
12a20 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
12a30 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
12a40 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
12a50 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
12a60 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
12a70 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
12a80 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
12a90 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
12aa0 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
12ab0 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
12ac0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
12ad0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
12ae0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
12af0 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
12b00 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
12b10 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
12b20 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
12b30 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
12b40 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
12b50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12b60 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
12b70 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
12b80 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
12b90 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
12ba0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
12bb0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
12bc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
12bd0 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
12be0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
12bf0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
12c00 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
12c10 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
12c20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
12c30 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
12c40 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
12c50 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
12c60 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
12c70 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
12c80 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
12c90 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64    freeIndex(pInd
12ca0 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
12cb0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
12cc0 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
12cd0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
12ce0 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
12cf0 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
12d00 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
12d10 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
12d20 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
12d30 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
12d40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
12d50 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
12d60 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
12d70 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
12d80 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
12d90 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
12da0 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
12db0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
12dc0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
12dd0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
12de0 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
12df0 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
12e00 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
12e10 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
12e20 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
12e30 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
12e40 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
12e50 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
12e60 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
12e70 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
12e80 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
12e90 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
12ea0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
12eb0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
12ec0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
12ed0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
12ee0 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
12ef0 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
12f00 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
12f10 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
12f20 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
12f30 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
12f40 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
12f50 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
12f60 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
12f70 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
12f80 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
12f90 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
12fa0 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
12fb0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
12fc0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
12fd0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
12fe0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
12ff0 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
13000 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
13010 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
13020 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
13030 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
13040 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
13050 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
13060 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
13070 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
13080 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
13090 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
130a0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
130b0 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
130c0 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
130d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
130e0 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  1; i--){.    a[i
130f0 5d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66  ] = 10;.  }.  if
13100 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
13110 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
13120 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
13130 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
13140 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13150 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
13160 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
13170 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
13180 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
13190 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
131a0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
131b0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
131c0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
131d0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29   SrcList *pName)
131e0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
131f0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
13200 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13210 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
13220 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
13230 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
13240 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  failed ){.    go
13250 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
13260 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
13270 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
13280 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
13290 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
132a0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
132b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
132c0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
132d0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
132e0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
132f0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
13300 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
13310 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
13320 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
13330 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13340 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
13350 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
13360 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
13370 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
13380 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
13390 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
133a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
133b0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
133c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
133d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
133e0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
133f0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
13400 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
13410 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
13420 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13430 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
13440 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13450 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13460 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
13470 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
13480 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13490 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
134a0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
134b0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
134c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
134d0 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
134e0 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
134f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13500 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
13510 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
13520 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13530 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13540 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
13550 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
13560 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13570 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13580 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
13590 54 5f 54 45 4d 50 44 42 20 26 26 20 70 49 6e 64  T_TEMPDB && pInd
135a0 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
135b0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
135c0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
135d0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
135e0 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
135f0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
13600 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
13610 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13620 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13630 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13640 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13650 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
13660 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
13670 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
13680 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
13690 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
136a0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
136b0 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e     int iDb = pIn
136c0 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71  dex->iDb;.    sq
136d0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
136e0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
136f0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
13700 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
13710 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
13720 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
13730 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
13740 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
13750 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
13760 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
13770 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
13780 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
13790 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
137a0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
137b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
137c0 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49  eOp3(v, OP_DropI
137d0 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49  ndex, iDb, 0, pI
137e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
137f0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
13800 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
13810 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
13820 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
13830 70 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e  pArray points in
13840 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77  to a structure w
13850 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
13860 20 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a   array pointer.*
13870 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77  * followed by tw
13880 6f 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  o integers. The 
13890 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73  first integer is
138a0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
138b0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
138c0 65 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61  e structure arra
138d0 79 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69  y.  The second i
138e0 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65  nteger.** is the
138f0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63   number of alloc
13900 61 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68  ated slots in th
13910 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  e array..**.** I
13920 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
13930 68 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f  he structure loo
13940 6b 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ks something lik
13950 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
13960 20 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d       struct Exam
13970 70 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20  ple1 {.**       
13980 20 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65     struct subEle
13990 6d 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  m *aEntry;.**   
139a0 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72         int nEntr
139b0 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
139c0 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20  nt nAlloc;.**   
139d0 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
139e0 20 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74   pnEntry paramet
139f0 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
13a00 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45   equivalent of E
13a10 78 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a  xample1.nEntry..
13a20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13a30 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  ne allocates a n
13a40 65 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61  ew slot in the a
13a50 72 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f  rray, zeros it o
13a60 75 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ut,.** and retur
13a70 6e 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49  ns its index.  I
13a80 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61  f malloc fails a
13a90 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
13aa0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
13ab0 0a 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74  .** szEntry is t
13ac0 68 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73  he sizeof of a s
13ad0 69 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72  ingle array entr
13ae0 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
13af0 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
13b00 66 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20  f array entries 
13b10 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
13b20 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
13b30 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
13b40 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
13b50 28 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c  (void **ppArray,
13b60 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e   int szEntry, in
13b70 74 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63  t initSize){.  c
13b80 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61  har *p;.  int *a
13b90 6e 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72  n = (int*)&ppArr
13ba0 61 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b  ay[1];.  if( an[
13bb0 30 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20  0]>=an[1] ){.   
13bc0 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20   void *pNew;.   
13bd0 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20   int newSize;.  
13be0 20 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31    newSize = an[1
13bf0 5d 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  ]*2 + initSize;.
13c00 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
13c10 65 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61  eRealloc(*ppArra
13c20 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
13c30 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
13c40 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  w==0 ){.      re
13c50 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
13c60 20 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69     an[1] = newSi
13c70 7a 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79  ze;.    *ppArray
13c80 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
13c90 20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d   = *ppArray;.  m
13ca0 65 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73  emset(&p[an[0]*s
13cb0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
13cc0 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  try);.  return a
13cd0 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n[0]++;.}../*.**
13ce0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
13cf0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
13d00 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
13d10 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
13d20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
13d30 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
13d40 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
13d50 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
13d60 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
13d70 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
13d80 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
13d90 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
13da0 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
13db0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13dc0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
13dd0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
13de0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
13df0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
13e00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
13e10 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
13e20 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c  0;.  }.  i = sql
13e30 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
13e40 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74  e((void**)&pList
13e50 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  ->a, sizeof(pLis
13e60 74 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20  t->a[0]), 5);.  
13e70 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
13e80 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
13e90 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  te(pList);.    r
13ea0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
13eb0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
13ec0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
13ed0 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
13ee0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
13ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
13f00 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
13f10 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
13f20 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
13f30 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
13f40 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13f50 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
13f60 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
13f70 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
13f80 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
13f90 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
13fa0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
13fb0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
13fc0 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
13fd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13fe0 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
13ff0 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
14000 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
14010 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
14020 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
14030 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
14040 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
14050 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
14060 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
14070 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14080 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
14090 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
140a0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
140b0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
140c0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
140d0 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
140e0 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
140f0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
14100 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
14110 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
14120 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
14130 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
14140 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
14150 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
14160 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
14170 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
14180 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
14190 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
141a0 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
141b0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
141c0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
141d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
141e0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
141f0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
14200 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
14210 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
14220 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
14230 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
14240 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
14250 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
14260 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
14270 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
14280 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
14290 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
142a0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
142b0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
142c0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
142d0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
142e0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
142f0 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
14300 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
14310 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
14320 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
14330 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
14340 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
14350 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
14360 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
14370 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
14380 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
14390 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
143a0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
143b0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
143c0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
143d0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
143e0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
143f0 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,0);.**.** 
14400 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
14410 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
14420 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
14430 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
14440 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
14450 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
14460 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
14470 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b  stAppend(A,B,C);
14480 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
14490 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
144a0 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
144b0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53  abase name..*/.S
144c0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
144d0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
144e0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
144f0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
14500 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
14510 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14520 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
14530 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
14540 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
14550 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
14560 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
14570 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
14580 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
14590 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
145a0 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
145b0 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
145c0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
145d0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
145e0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
145f0 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
14600 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
14610 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14620 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
14630 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   + (pList->nAllo
14640 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  c-1)*sizeof(pLis
14650 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
14660 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
14670 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
14680 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
14690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
146a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
146b0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
146c0 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
146d0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a  a[pList->nSrc];.
146e0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
146f0 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
14700 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
14710 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
14720 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
14730 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
14740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
14750 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
14760 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
14770 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
14780 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
14790 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
147a0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
147b0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
147c0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
147d0 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a  mToken(pTable);.
147e0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
147f0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
14800 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62  FromToken(pDatab
14810 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69  ase);.  pItem->i
14820 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
14830 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
14840 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
14850 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
14860 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
14870 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
14880 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14890 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
148a0 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
148b0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
148c0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
148d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
148e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
148f0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
14900 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
14910 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
14920 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  ++){.    if( pIt
14930 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
14940 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65   break;.    pIte
14950 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
14960 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
14970 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
14980 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
14990 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
149a0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
149b0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
149c0 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  >pSrc);.    }.  
149d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
149e0 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c  n alias to the l
149f0 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f  ast identifier o
14a00 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e  n the given iden
14a10 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a  tifier list..*/.
14a20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
14a30 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
14a40 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
14a50 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
14a60 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
14a70 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
14a80 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
14a90 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d  nSrc-1].zAlias =
14aa0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
14ab0 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
14ac0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
14ad0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
14ae0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
14af0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
14b00 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
14b10 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
14b20 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
14b30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14b40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14b50 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
14b60 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
14b70 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
14b80 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
14b90 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
14ba0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14bb0 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
14bc0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
14bd0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
14be0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
14bf0 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
14c00 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73  ->zAlias);.    s
14c10 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
14c20 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  e(0, pItem->pTab
14c30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
14c40 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d  lectDelete(pItem
14c50 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
14c60 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14c70 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  e(pItem->pOn);. 
14c80 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
14c90 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55  Delete(pItem->pU
14ca0 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
14cb0 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
14cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
14cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14ce0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
14cf0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
14d00 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14d10 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
14d20 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
14d30 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
14d40 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
14d50 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
14d60 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
14d70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
14d80 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
14d90 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
14da0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
14db0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
14dc0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14dd0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
14de0 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
14df0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14e00 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14e10 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14e20 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
14e30 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
14e40 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
14e50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
14e60 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
14e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e80 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
14e90 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
14ea0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
14eb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
14ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14ed0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
14ee0 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
14ef0 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
14f00 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
14f10 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
14f20 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
14f30 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
14f40 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
14f50 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
14f60 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
14f70 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
14f80 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
14f90 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
14fa0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
14fb0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
14fc0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
14fd0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14fe0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
14ff0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
15000 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
15010 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
15020 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15030 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15040 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15050 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15060 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
15070 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15080 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
15090 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
150a0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
150b0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
150c0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
150d0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
150e0 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
150f0 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
15100 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
15110 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
15120 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15130 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
15140 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
15150 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
15160 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
15170 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
15180 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
15190 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
151a0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
151b0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
151c0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
151d0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
151e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
151f0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
15200 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
15210 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15220 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
15230 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
15240 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
15250 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
15260 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
15270 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
15280 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
15290 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
152a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
152b0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
152c0 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
152d0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
152e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
152f0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
15300 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
15310 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
15320 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
15330 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
15340 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d  tory(db, 0, 0, M
15350 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
15360 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
15370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15380 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
15390 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
153a0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
153b0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
153c0 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
153d0 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
153e0 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
153f0 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
15400 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
15410 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15420 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
15430 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
15440 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
15450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15460 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
15470 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29  ->aDb[1].pBt, 1)
15480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
154a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
154b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
154c0 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72  able to get a wr
154d0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20  ite lock on ".  
154e0 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d          "the tem
154f0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
15500 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20  file");.        
15510 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
15520 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15530 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15560 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
15570 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
15580 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
15590 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
155a0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
155b0 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
155c0 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
155d0 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
155e0 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
155f0 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
15600 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
15610 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
15620 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
15630 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
15640 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
15650 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
15660 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
15670 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
15680 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
15690 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
156a0 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
156b0 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
156c0 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
156d0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
156e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
156f0 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
15700 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
15710 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
15720 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
15730 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
15740 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
15750 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
15760 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
15770 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
15780 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
15790 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
157a0 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
157b0 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
157c0 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
157d0 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
157e0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
157f0 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
15800 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
15810 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
15820 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
15830 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
15840 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
15850 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
15860 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
15870 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
15880 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
15890 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
158a0 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
158b0 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
158c0 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
158d0 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
158e0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
158f0 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
15900 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
15910 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
15920 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
15930 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
15940 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
15950 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
15960 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
15970 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
15980 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
15990 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
159a0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
159b0 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
159c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
159d0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
159e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
159f0 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
15a00 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
15a10 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
15a20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15a30 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15a40 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
15a50 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
15a60 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
15a70 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
15a80 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
15a90 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
15aa0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
15ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
15ac0 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
15ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ae0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15af0 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
15b00 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
15b10 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
15b20 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
15b30 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
15b40 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
15b50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
15b60 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b  b<32 );.    mask
15b70 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69   = 1<<iDb;.    i
15b80 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  f( (pParse->cook
15b90 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
15ba0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  0 ){.      pPars
15bb0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
15bc0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61   mask;.      pPa
15bd0 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
15be0 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
15bf0 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
15c00 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
15c10 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
15c20 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
15c30 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
15c40 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
15c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15c60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
15c70 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
15c80 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
15c90 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
15ca0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
15cb0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
15cc0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
15cd0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
15ce0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
15cf0 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
15d00 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
15d10 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
15d20 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
15d30 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
15d40 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
15d50 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
15d60 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
15d70 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
15d80 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
15d90 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
15da0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
15db0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
15dc0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
15dd0 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
15de0 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
15df0 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
15e00 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
15e10 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
15e20 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
15e30 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
15e40 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
15e50 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
15e60 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
15e70 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
15e80 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
15e90 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
15ea0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
15eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
15ec0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
15ed0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
15ee0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
15ef0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
15f00 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
15f10 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
15f20 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
15f30 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
15f40 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
15f50 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
15f60 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
15f70 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
15f80 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
15f90 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
15fa0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
15fb0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
15fc0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
15fd0 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
15fe0 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
15ff0 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
16000 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
16010 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
16020 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
16030 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
16040 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16050 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
16060 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
16070 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
16080 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
16090 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
160a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
160b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
160c0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
160d0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
160e0 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
160f0 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
16100 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
16110 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
16120 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
16130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16140 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
16150 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
16160 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
16170 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
16180 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
16190 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
161a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
161b0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
161c0 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
161d0 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
161e0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
161f0 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
16200 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
16210 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
16220 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
16230 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
16240 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
16250 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
16260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
16270 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
16280 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43  collationMatch(C
16290 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49  ollSeq *pColl, I
162a0 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
162b0 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d   int n = pIndex-
162c0 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b  >keyInfo.nField;
162d0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20  .  CollSeq **pp 
162e0 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  = pIndex->keyInf
162f0 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65  o.aColl;.  while
16300 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28  ( n-- ){.    if(
16310 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65   *pp==pColl ) re
16320 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b  turn 1;.    pp++
16330 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
16340 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16350 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
16360 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
16370 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
16380 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
16390 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
163a0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
163b0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
163c0 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
163d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
163e0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
163f0 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
16400 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16410 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f   Table *pTab, Co
16420 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
16430 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16450 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
16460 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
16470 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
16480 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
16490 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
164a0 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
164b0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( pColl==0 || 
164c0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70  collationMatch(p
164d0 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a  Coll,pIndex) ){.
164e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
164f0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
16500 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62  (pParse, 0, pTab
16510 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  ->iDb);.      sq
16520 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16530 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16540 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
16550 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16560 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
16570 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
16580 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
16590 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
165a0 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
165b0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
165c0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
165d0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
165e0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
165f0 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
16600 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
16610 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
16620 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
16630 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
16640 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
16650 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
16660 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16680 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
16690 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
166c0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
166d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
166e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
166f0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16700 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16710 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16730 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
16740 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
16750 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
16780 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
16790 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
167a0 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
167b0 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
167c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62  ++){.    if( pDb
167d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
167e0 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
167f0 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
16800 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
16810 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
16820 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
16830 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
16840 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
16850 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
16860 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f  Parse, pTab, pCo
16870 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
16880 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
16890 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
168a0 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
168b0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
168c0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
168f0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
16900 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
16910 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
16920 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
16930 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
16940 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
16950 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
16960 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
16970 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
16980 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
16990 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
169a0 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
169b0 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
169c0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
169d0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
169e0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
169f0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
16a00 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
16a10 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
16a20 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
16a30 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
16a40 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
16a50 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
16a60 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
16a70 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
16a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a90 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
16aa0 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
16ab0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16ac0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
16ad0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
16ae0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b00 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
16b10 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
16b20 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
16b30 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b50 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
16b60 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
16b70 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
16b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16b90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
16ba0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
16bb0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
16bc0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
16bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
16be0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
16bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16c00 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
16c10 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
16c20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16c50 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
16c60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16c70 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
16c80 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16c90 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
16ca0 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
16cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16cc0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
16cd0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
16ce0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
16cf0 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
16d00 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
16d10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
16d20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
16d30 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
16d40 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
16d50 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
16d60 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
16d70 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
16d80 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
16d90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16da0 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
16db0 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d  0 || pName1->z==
16dc0 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
16dd0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
16de0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16df0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  ;.  }else if( pN
16e00 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame2==0 || pName
16e10 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  2->z==0 ){.    p
16e20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
16e30 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62  ndCollSeq(db, db
16e40 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a  ->enc, pName1->z
16e50 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b  , pName1->n, 0);
16e60 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
16e70 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
16e80 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
16e90 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   pColl);.      r
16ea0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
16eb0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
16ec0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
16ed0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
16ee0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
16ef0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
16f00 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
16f10 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
16f20 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44  (pObjName);.  zD
16f30 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
16f40 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
16f50 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
16f60 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
16f70 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
16f80 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
16f90 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
16fa0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
16fb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16fc0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
16fd0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
16fe0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
16ff0 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69  liteFree(z);.  i
17000 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
17010 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
17020 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
17030 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
17040 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
17050 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
17060 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
17070 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
17080 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17090 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
170a0 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
170b0 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
170c0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a        d");.}.#endif.