/ Hex Artifact Content
Login

Artifact d61682e8d0368fbc6ff230cd4b9bd41659d5634b:


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 34 20 32 30 30 35 2f 30 38 2f 33 31  1.344 2005/08/31
02f0: 20 31 33 3a 31 33 3a 33 31 20 64 72 68 20 45 78   13:13:31 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 6e 4d 61 78 44 65 70 74 68 2b 31 2c 20 70  ->nMaxDepth+1, p
0d20: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
0d30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0d40: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
0d50: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0d60: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0d70: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0d80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0d90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0da0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0db0: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0dc0: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0dd0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0de0: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0df0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
0e00: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
0e10: 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  okieMask = 0;.  
0e20: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0e30: 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  to = 0;.}../*.**
0e40: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
0e50: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
0e60: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
0e70: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
0e80: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
0e90: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
0ea0: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
0eb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
0ec0: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
0ed0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
0ee0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
0ef0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
0f00: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
0f10: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
0f20: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
0f30: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
0f40: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
0f50: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
0f60: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
0f70: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
0f80: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
0f90: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
0fa0: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
0fb0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
0fc0: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
0fd0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
0fe0: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
0ff0: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1000: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
1010: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
1020: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1030: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1040: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1050: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1060: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1070: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1080: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1090: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
10a0: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
10b0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
10c0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
10d0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
10e0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
10f0: 74 20 72 63 3b 0a 23 20 64 65 66 69 6e 65 20 53  t rc;.# define S
1100: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
1110: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
1120: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
1130: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
1140: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
1150: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
1160: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
1170: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
1180: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
1190: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
11a0: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
11b0: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
11c0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
11d0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
11e0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
11f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
1200: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
1210: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
1220: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
1230: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
1240: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1250: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
1260: 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72  y(saveBuf, &pPar
1270: 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53  se->nVar, SAVE_S
1280: 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50  Z);.  memset(&pP
1290: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53  arse->nVar, 0, S
12a0: 41 56 45 5f 53 5a 29 3b 0a 20 20 72 63 20 3d 20  AVE_SZ);.  rc = 
12b0: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
12c0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30  (pParse, zSql, 0
12d0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
12e0: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
12f0: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
1300: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
1310: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
1320: 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ed--;.}../*.** L
1330: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1340: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
1350: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
1360: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1370: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
1380: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1390: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
13a0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
13b0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
13c0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
13d0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
13e0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
13f0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
1400: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
1410: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
1420: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1430: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
1440: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
1450: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
1460: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
1470: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
1480: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
1490: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
14a0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
14b0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
14c0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
14d0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
14e0: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
14f0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1500: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
1510: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
1520: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
1530: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
1540: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
1550: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1560: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1570: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
1580: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
1590: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
15a0: 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( zName!=0 );.  
15b0: 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61  assert( (db->fla
15c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74  gs & SQLITE_Init
15d0: 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e  ialized) || db->
15e0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66  init.busy );.  f
15f0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
1600: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1610: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
1620: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
1630: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
1640: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1650: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
1660: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
1670: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
1680: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
1690: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
16a0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
16b0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
16c0: 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  [j].tblHash, zNa
16d0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
16e0: 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  )+1);.    if( p 
16f0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
1700: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1710: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
1720: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1730: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1740: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1750: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
1760: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1770: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
1780: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
1790: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
17a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
17b0: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
17c0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
17d0: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
17e0: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
17f0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
1800: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
1810: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
1820: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1830: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
1840: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
1850: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
1860: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
1870: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1880: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
1890: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
18a0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
18b0: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
18c0: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
18d0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
18e0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
18f0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1900: 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61  r *zDbase){.  Ta
1910: 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65  ble *p;..  /* Re
1920: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1930: 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
1940: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
1950: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1960: 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
1970: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
1980: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
1990: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
19a0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
19b0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
19c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
19d0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
19e0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
19f0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
1a00: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
1a10: 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20  .    if( zDbase 
1a20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a40: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
1a50: 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c   %s.%s", zDbase,
1a60: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
1a70: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1a80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a90: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1aa0: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
1ab0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
1ac0: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
1ad0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1ae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
1af0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1b00: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1b10: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
1b20: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
1b30: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1b40: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
1b50: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
1b60: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
1b70: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
1b80: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
1b90: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1ba0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
1bb0: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
1bc0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
1bd0: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
1be0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
1bf0: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
1c00: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
1c10: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
1c20: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
1c30: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
1c40: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
1c50: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
1c60: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
1c70: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
1c80: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
1c90: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
1ca0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
1cb0: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
1cc0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1cd0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1ce0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1cf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d00: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1d10: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
1d20: 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73  sert( (db->flags
1d30: 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61   & SQLITE_Initia
1d40: 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e  lized) || db->in
1d50: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72  it.busy );.  for
1d60: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
1d70: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1d80: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
1d90: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
1da0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
1db0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
1dc0: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
1dd0: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
1de0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
1df0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1e00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1e10: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
1e20: 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ].idxHash, zName
1e30: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
1e40: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
1e50: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1e60: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1e70: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
1e80: 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  ry used by an in
1e90: 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dex.*/.static vo
1ea0: 69 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64  id freeIndex(Ind
1eb0: 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ex *p){.  sqlite
1ec0: 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  Free(p->zColAff)
1ed0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
1ee0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
1ef0: 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  ve the given ind
1f00: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ex from the inde
1f10: 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e  x hash table, an
1f20: 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65  d free.** its me
1f30: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e  mory structures.
1f40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
1f50: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
1f60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1f70: 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a  sh tables but.**
1f80: 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e   it is not unlin
1f90: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ked from the Tab
1fa0: 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78  le that it index
1fb0: 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67  es..** Unlinking
1fc0: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
1fd0: 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20  must be done by 
1fe0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1ff0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2000: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
2010: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
2020: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
2030: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20   Index *pOld;.. 
2040: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26   assert( db!=0 &
2050: 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  & p->zName!=0 );
2060: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
2070: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
2080: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
2090: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
20c0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64  ;.  assert( pOld
20e0: 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29  ==0 || pOld==p )
20f0: 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29  ;.  freeIndex(p)
2100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
2110: 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20  he index called 
2120: 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69  zIdxName which i
2130: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
2140: 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20  atabase iDb,.** 
2150: 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65  unlike that inde
2160: 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65  x from its Table
2170: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
2180: 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74   index from.** t
2190: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
21a0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ble and free all
21b0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
21c0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  es associated.**
21d0: 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e   with the index.
21e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21f0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
2200: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2210: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
2220: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
2230: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
2240: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  x;.  int len;.. 
2250: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
2260: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
2270: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
2280: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2290: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49 64  Db].idxHash, zId
22a0: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
22b0: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
22c0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
22d0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
22e0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
22f0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
2300: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
2310: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
2320: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
2330: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
2340: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2350: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2360: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2370: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2380: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2390: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
23a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
23b0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
23c0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
23d0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
23e0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
23f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
2400: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2420: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
2430: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
2440: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2450: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
2460: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
2470: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2480: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
2490: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
24a0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
24b0: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
24c0: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
24d0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
24e0: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
24f0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
2500: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
2510: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
2520: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
2530: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
2540: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
2550: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2560: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
2570: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
2580: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
2590: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
25a0: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
25b0: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
25c0: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
25d0: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
25e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
25f0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2600: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
2610: 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68  int iDb){.  Hash
2620: 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
2630: 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73  ash temp1;.  Has
2640: 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69  h temp2;.  int i
2650: 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  , j;..  assert( 
2660: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
2670: 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66  ->nDb );.  db->f
2680: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2690: 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66  Initialized;.  f
26a0: 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e  or(i=iDb; i<db->
26b0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
26c0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
26d0: 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20  b[i];.    temp1 
26e0: 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a  = pDb->tblHash;.
26f0: 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d      temp2 = pDb-
2700: 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73  >trigHash;.    s
2710: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
2720: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53  pDb->trigHash, S
2730: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
2740: 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  G, 0);.    sqlit
2750: 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62  e3HashClear(&pDb
2760: 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71  ->aFKey);.    sq
2770: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2780: 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20  pDb->idxHash);. 
2790: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
27a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
27b0: 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp2); pElem; pEl
27c0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
27d0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
27e0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
27f0: 69 67 67 65 72 28 28 54 72 69 67 67 65 72 2a 29  igger((Trigger*)
2800: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2810: 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Elem));.    }.  
2820: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2830: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20  ar(&temp2);.    
2840: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
2850: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53  &pDb->tblHash, S
2860: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
2870: 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70  G, 0);.    for(p
2880: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
2890: 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45  irst(&temp1); pE
28a0: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
28b0: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
28c0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
28d0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
28e0: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
28f0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
2900: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
2910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2920: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65  te3HashClear(&te
2930: 6d 70 31 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70  mp1);.    pDb->p
2940: 53 65 71 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  SeqTab = 0;.    
2950: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
2960: 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61  db, i, DB_Schema
2970: 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28  Loaded);.    if(
2980: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
2990: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
29a0: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
29b0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
29c0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
29d0: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d    /* If one or m
29e0: 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c  ore of the auxil
29f0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2a00: 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  les has been clo
2a10: 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  sed,.  ** then r
2a20: 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20  emove then from 
2a30: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
2a40: 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65  tabase list.  We
2a50: 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f   take the.  ** o
2a60: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f  pportunity to do
2a70: 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65   this here since
2a80: 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65   we have just de
2a90: 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  leted all of the
2aa0: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73  .  ** schema has
2ab0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2ac0: 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61  refore do not ha
2ad0: 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63  ve to make any c
2ae0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61  hanges.  ** to a
2af0: 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c  ny of those tabl
2b00: 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2b10: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
2b20: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2b30: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2b40: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
2b50: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
2b60: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75      if( pDb->pAu
2b70: 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41  x && pDb->xFreeA
2b80: 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41  ux ) pDb->xFreeA
2b90: 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20  ux(pDb->pAux);. 
2ba0: 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d       pDb->pAux =
2bb0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2bc0: 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d  for(i=j=2; i<db-
2bd0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2be0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
2bf0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
2c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
2c10: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2c20: 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65  eFree(pDb->zName
2c30: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
2c40: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
2c50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2c60: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
2c70: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
2c80: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
2c90: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
2ca0: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
2cb0: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
2cc0: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
2cd0: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
2ce0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
2cf0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
2d00: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
2d10: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
2d20: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
2d30: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
2d40: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
2d50: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2d60: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
2d70: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
2d80: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
2d90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2da0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
2db0: 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ver a rollback o
2dc0: 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72 65  ccurs.  If there
2dd0: 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20   were.** schema 
2de0: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
2df0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
2e00: 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20  then we have to 
2e10: 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74  reset the.** int
2e20: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
2e30: 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65  s and reload the
2e40: 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a  m from disk..*/.
2e50: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
2e60: 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e  backInternalChan
2e70: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
2e80: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  {.  if( db->flag
2e90: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
2ea0: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
2eb0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
2ec0: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
2ed0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ee0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2ef0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
2f00: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
2f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
2f20: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
2f30: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
2f40: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2f50: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2f60: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nges;.}../*.** C
2f70: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
2f80: 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62  names from a tab
2f90: 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73  le or view..*/.s
2fa0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2fb0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
2fc0: 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  s(Table *pTable)
2fd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
2fe0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
2ff0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
3000: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
3010: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
3020: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3030: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
3040: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
3050: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3060: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3070: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3080: 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c  elete(pCol->pDfl
3090: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
30a0: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
30b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
30c0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
30d0: 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61  aCol);.  }.  pTa
30e0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
30f0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
3100: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  0;.}../*.** Remo
3110: 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61  ve the memory da
3120: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ta structures as
3130: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3140: 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65  e given.** Table
3150: 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  .  No changes ar
3160: 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62  e made to disk b
3170: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
3180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3190: 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20  ne just deletes 
31a0: 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
31b0: 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  re.  It does not
31c0: 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74   unlink.** the t
31d0: 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74  able data struct
31e0: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ure from the has
31f0: 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f  h table.  Nor do
3200: 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20  es it remove.** 
3210: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f  foreign keys fro
3220: 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b  m the sqlite.aFK
3230: 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ey hash table.  
3240: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
3250: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
3260: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
3270: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
3280: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
3290: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
32a0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e   table..**.** In
32b0: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
32c0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
32d0: 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  are unlinked fro
32e0: 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61  m the "db".** da
32f0: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66 20  ta structure if 
3300: 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62  db!=NULL.  If db
3310: 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20  ==NULL, indices 
3320: 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74  attached to.** t
3330: 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c  he table are del
3340: 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  eted, but it is 
3350: 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61 76  assumed they hav
3360: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  e already been.*
3370: 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76  * unlinked..*/.v
3380: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
3390: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
33a0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
33b0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
33c0: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46  dex, *pNext;.  F
33d0: 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65  Key *pFKey, *pNe
33e0: 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70  xtFKey;..  if( p
33f0: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
3400: 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  n;..  /* Do not 
3410: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
3420: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
3430: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
3440: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54  es zero. */.  pT
3450: 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  able->nRef--;.  
3460: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  if( pTable->nRef
3470: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
3480: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
3490: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20  pTable->nRef==0 
34a0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
34b0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
34c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
34d0: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f   table.  */.  fo
34e0: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
34f0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
3500: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
3510: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
3520: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3530: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
3540: 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44  >iDb==pTable->iD
3550: 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44  b || (pTable->iD
3560: 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e  b==0 && pIndex->
3570: 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73  iDb==1) );.    s
3580: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
3590: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
35a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
35b0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
35c0: 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  EY.  /* Delete a
35d0: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
35e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35f0: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65  this table.  The
3600: 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c   keys.  ** shoul
3610: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
3620: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  een unlinked fro
3630: 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20  m the db->aFKey 
3640: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
3650: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
3660: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
3670: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
3680: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
3690: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
36a0: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
36b0: 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64  t( pTable->iDb<d
36c0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
36d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73  sert( sqlite3Has
36e0: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70  hFind(&db->aDb[p
36f0: 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65  Table->iDb].aFKe
3700: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
3720: 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e  Key->zTo, strlen
3730: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21  (pFKey->zTo)+1)!
3740: 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71  =pFKey );.    sq
3750: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
3760: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
3770: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
3780: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
3790: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
37a0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
37b0: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
37c0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
37d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
37e0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43  eFree(pTable->zC
37f0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3800: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  3SelectDelete(pT
3810: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
3820: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3830: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ble);.}../*.** U
3840: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
3850: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
3860: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
3870: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
3880: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
3890: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
38a0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
38b0: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
38c0: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
38d0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
38e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
38f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
3900: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
3910: 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31   *p;.  FKey *pF1
3920: 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44  , *pF2;.  Db *pD
3930: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
3940: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3950: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
3960: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
3970: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  rt( zTabName && 
3980: 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20  zTabName[0] );. 
3990: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
39a0: 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  iDb];.  p = sqli
39b0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
39c0: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  Db->tblHash, zTa
39d0: 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54  bName, strlen(zT
39e0: 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  abName)+1, 0);. 
39f0: 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e 64 65   if( p ){.#ifnde
3a00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3a10: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f  REIGN_KEY.    fo
3a20: 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20  r(pF1=p->pFKey; 
3a30: 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e  pF1; pF1=pF1->pN
3a40: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
3a50: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
3a60: 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  (pF1->zTo) + 1;.
3a70: 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69        pF2 = sqli
3a80: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62  te3HashFind(&pDb
3a90: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3aa0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69  o, nTo);.      i
3ab0: 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20  f( pF2==pF1 ){. 
3ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
3ad0: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61  shInsert(&pDb->a
3ae0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
3af0: 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54  nTo, pF1->pNextT
3b00: 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
3b10: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
3b20: 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78  pF2 && pF2->pNex
3b30: 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d  tTo!=pF1 ){ pF2=
3b40: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a  pF2->pNextTo; }.
3b50: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 32 20          if( pF2 
3b60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 32  ){.          pF2
3b70: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d  ->pNextTo = pF1-
3b80: 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20  >pNextTo;.      
3b90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3ba0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
3bb0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
3bc0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 64 62  db, p);.  }.  db
3bd0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
3be0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
3c00: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
3c10: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
3c20: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
3c30: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
3c40: 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f  ken with any quo
3c50: 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e  tations removed.
3c60: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
3c70: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
3c80: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
3c90: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
3ca0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
3cb0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
3cc0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
3cd0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ion..**.** Token
3ce0: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
3cf0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
3d00: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
3d10: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
3d20: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
3d30: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
3d40: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
3d50: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
3d60: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
3d70: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
3d80: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
3d90: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
3da0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
3db0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
3dc0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
3dd0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
3de0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
3df0: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
3e00: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
3e10: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
3e20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
3e30: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
3e40: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
3e50: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
3e60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
3e70: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
3e80: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
3e90: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
3ea0: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
3eb0: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
3ec0: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
3ed0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
3ee0: 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  able(Vdbe *v, in
3ef0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
3f00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3f10: 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
3f20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3f30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
3f40: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
3f50: 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65  _ROOT);.  sqlite
3f60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3f70: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
3f80: 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65  0, 5); /* sqlite
3f90: 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63 6f  _master has 5 co
3fa0: 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  lumns */.}../*.*
3fb0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61  * The token *pNa
3fc0: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
3fd0: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
3fe0: 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e  se (either "main
3ff0: 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f  " or.** "temp" o
4000: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
4010: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
4020: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4030: 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  rns the.** index
4040: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
4050: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
4060: 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68  b[], or -1 if th
4070: 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64  e named db .** d
4080: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
4090: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
40a0: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
40b0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
40c0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
40d0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
40e0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ber */.  int n; 
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4100: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
4110: 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  in the name */. 
4120: 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
4130: 2f 2a 20 41 20 64 61 74 61 62 61 73 65 20 77 68  /* A database wh
4140: 6f 73 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69  ose name space i
4150: 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
4160: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
4170: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20  e;   /* Name we 
4180: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
4190: 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  r */..  zName = 
41a0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
41b0: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
41c0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
41d0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
41e0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  );.    for(i=(db
41f0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
4200: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
4210: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
4220: 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54      if( (!OMIT_T
4230: 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20  EMPDB || i!=1 ) 
4240: 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62  && n==strlen(pDb
4250: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
4260: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
4270: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
4280: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
4290: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
42a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
42b0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
42c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
42d0: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
42e0: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
42f0: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
4300: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
4310: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
4320: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
4330: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
4340: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
4350: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
4360: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
4370: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
4380: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
4390: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
43a0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
43b0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
43c0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
43d0: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
43e0: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
43f0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4400: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
4410: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
4420: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
4430: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4440: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
4450: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
4460: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
4470: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
4480: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
4490: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
44a0: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
44b0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
44c0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
44d0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
44e0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
44f0: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
4500: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
4510: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
4520: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
4530: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
4540: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
4550: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
4560: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
4570: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
4580: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
4590: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
45a0: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
45b0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
45c0: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
45d0: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
45e0: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
45f0: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
4600: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
4610: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
4620: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
4630: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
4640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4650: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
4660: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
4670: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4680: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
4690: 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
46a0: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  >n>0 ){.    asse
46b0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
46c0: 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75  sy );.    *pUnqu
46d0: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
46e0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
46f0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
4700: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
4710: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4720: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4730: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
4740: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
4750: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4760: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
4770: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
4780: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4790: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
47a0: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
47b0: 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  usy );.    iDb =
47c0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
47d0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
47e0: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
47f0: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
4800: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4810: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
4820: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
4830: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
4840: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
4850: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
4860: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
4870: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
4880: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
4890: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
48a0: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
48b0: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
48c0: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
48d0: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
48e0: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
48f0: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
4900: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
4910: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
4920: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
4930: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
4940: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
4950: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
4960: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
4970: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4980: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
4990: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
49a0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
49b0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
49c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
49d0: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
49e0: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
49f0: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
4a00: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
4a10: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
4a20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4a30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4a40: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
4a50: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
4a60: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
4a70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
4a80: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
4a90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4aa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  OK;.}../*.** Beg
4ab0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
4ac0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
4ad0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
4ae0: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
4af0: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
4b00: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
4b10: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
4b20: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
4b30: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
4b40: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4b50: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
4b60: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
4b70: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
4b80: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
4b90: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
4ba0: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
4bb0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a  ble name.  The.*
4bc0: 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69  * pStart token i
4bd0: 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64  s the CREATE and
4be0: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61   pName is the ta
4bf0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4c00: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
4c10: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
4c20: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
4c30: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
4c40: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
4c50: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
4c60: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
4c70: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
4c80: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
4c90: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
4ca0: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
4cb0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
4cc0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
4cd0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
4ce0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
4cf0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
4d00: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
4d10: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
4d20: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
4d30: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
4d40: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
4d50: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
4d60: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
4d70: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
4d80: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
4d90: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
4da0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
4db0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
4dc0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
4dd0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4de0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
4df0: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
4e00: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
4e10: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
4e20: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
4e30: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
4e40: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
4e50: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
4e60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4e70: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
4e80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
4e90: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
4ea0: 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b  The "CREATE" tok
4eb0: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
4ec0: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
4ed0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
4ee0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4ef0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
4f00: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
4f10: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
4f20: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4f30: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
4f40: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
4f50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4f60: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
4f70: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
4f80: 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75  iew       /* Tru
4f90: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
4fa0: 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  IEW */.){.  Tabl
4fb0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64  e *pTable;.  Ind
4fc0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72  ex *pIdx;.  char
4fd0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
4fe0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
4ff0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
5000: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5010: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
5020: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
5030: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5040: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
5050: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
5060: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5070: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
5080: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
5090: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
50a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
50b0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
50c0: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
50d0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
50e0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
50f0: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
5100: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
5110: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
5120: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5130: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
5140: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5150: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
5160: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
5170: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5180: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5190: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
51a0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
51b0: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
51c0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
51d0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
51e0: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
51f0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5200: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
5210: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5220: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5230: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
5240: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
5250: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
5260: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
5270: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
5280: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
5290: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
52a0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
52b0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
52c0: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
52d0: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
52e0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
52f0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
5300: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5310: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
5320: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
5330: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
5340: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
5350: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
5360: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
5370: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
5380: 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f  rn;.  if( !OMIT_
5390: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
53a0: 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   && iDb>1 ){.   
53b0: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
53c0: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
53d0: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
53e0: 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20  e qualified */. 
53f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5400: 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70  sg(pParse, "temp
5410: 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  orary table name
5420: 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69   must be unquali
5430: 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  fied");.    retu
5440: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f  rn;.  }.  if( !O
5450: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5460: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
5470: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
5480: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
5490: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
54a0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
54b0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
54c0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
54d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
54e0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
54f0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
5500: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
5510: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5520: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5530: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
5540: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
5550: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5560: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
5570: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
5580: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
5590: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
55a0: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
55b0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
55c0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
55d0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
55e0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
55f0: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
5600: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
5610: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
5620: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5630: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
5640: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
5650: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
5660: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5670: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
5680: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5690: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
56a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
56b0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
56c0: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
56d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
56e0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
56f0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5700: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5710: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5720: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
5730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5740: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5750: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
5760: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5770: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
5780: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
5790: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
57a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
57b0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
57c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
57d0: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
57e0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
57f0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
5800: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
5810: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
5820: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
5830: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
5840: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
5850: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
5860: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20  .  ** it does.. 
5870: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
5880: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
5890: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
58a0: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
58b0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
58c0: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
58d0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
58e0: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
58f0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
5900: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
5910: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5920: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
5930: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
5940: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
5950: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5960: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
5970: 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74  f( (pIdx = sqlit
5980: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
5990: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26  zName, 0))!=0 &&
59a0: 20 0a 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30   .      ( iDb==0
59b0: 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   || !db->init.bu
59c0: 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sy) ){.    sqlit
59d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
59e0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
59f0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
5a00: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
5a10: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
5a20: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
5a30: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
5a40: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
5a50: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
5a60: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
5a70: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
5a80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5a90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5aa0: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
5ab0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
5ac0: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
5ad0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
5ae0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
5af0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
5b00: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
5b10: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
5b20: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
5b30: 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44  pTable->iDb = iD
5b40: 62 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  b;.  pTable->nRe
5b50: 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61  f = 1;.  if( pPa
5b60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
5b70: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5b80: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
5b90: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50  pNewTable);.  pP
5ba0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
5bb0: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
5bc0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
5bd0: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
5be0: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
5bf0: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
5c00: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
5c10: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
5c20: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
5c30: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
5c40: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
5c50: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
5c60: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
5c70: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
5c80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5c90: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
5ca0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
5cb0: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
5cc0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
5cd0: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
5ce0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
5cf0: 2e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  .pSeqTab = pTabl
5d00: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
5d10: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
5d20: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
5d30: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
5d40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
5d50: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
5d60: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
5d70: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
5d80: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
5d90: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
5da0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
5db0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
5dc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
5dd0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
5de0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
5df0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
5e00: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
5e10: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
5e20: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
5e30: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
5e40: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
5e50: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5e60: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
5e70: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
5e80: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
5e90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
5ea0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
5eb0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
5ec0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
5ed0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
5ee0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
5ef0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5f00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
5f10: 20 6c 62 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65   lbl;.    sqlite
5f20: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
5f30: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
5f40: 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  iDb);..    /* If
5f50: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
5f60: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
5f70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5f80: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
5f90: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
5fa0: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
5fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5fc0: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
5fd0: 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 20 20 20  kie, iDb, 1);   
5fe0: 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a  /* file_format *
5ff0: 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69  /.    lbl = sqli
6000: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6010: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6020: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6030: 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20 20  If, 0, lbl);.   
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
6060: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
6070: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6080: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6090: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
60a0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
60b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
60c0: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63  Integer, db->enc
60d0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
60e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60f0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
6100: 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   4);.    sqlite3
6110: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6120: 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f  (v, lbl);..    /
6130: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
6140: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
6150: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
6160: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
6170: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
6180: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
6190: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
61a0: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
61b0: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
61c0: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
61d0: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
61e0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
61f0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
6200: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
6210: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
6220: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
6230: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f  s left on the to
6240: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
6250: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
6260: 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64   value is needed
6270: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
6280: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
6290: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65  e will.    ** ge
62a0: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
62b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
62c0: 49 54 5f 56 49 45 57 0a 20 20 20 20 69 66 28 20  IT_VIEW.    if( 
62d0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
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 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6300: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
6310: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
6320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6330: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
6340: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b  eTable, iDb, 0);
6350: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6360: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
6370: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  e(v, iDb);.    s
6380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6390: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
63a0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
63b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
63c0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
63d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
63e0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
63f0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6400: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6410: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 30 29 3b 0a  _Insert, 0, 0);.
6420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6430: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
6440: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6450: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6460: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
6470: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
6480: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
6490: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
64a0: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
64b0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
64c0: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
64d0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
64e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
64f0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
6500: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
6510: 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ro is used to co
6520: 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67  mpare two string
6530: 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65  s in a case-inse
6540: 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a  nsitive manner..
6550: 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c  ** It is slightl
6560: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61  y faster than ca
6570: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72  lling sqlite3Str
6580: 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c  ICmp() directly,
6590: 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73   but.** produces
65a0: 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a   larger code..**
65b0: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69  .** WARNING: Thi
65c0: 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63  s macro is not c
65d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
65e0: 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69  he strcmp() fami
65f0: 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  ly. It.** return
6600: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77  s true if the tw
6610: 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71  o strings are eq
6620: 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66  ual, otherwise f
6630: 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  alse..*/.#define
6640: 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28   STRICMP(x, y) (
6650: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
6660: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
6670: 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20   char *)(x)]==  
6680: 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54   \.sqlite3UpperT
6690: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
66a0: 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20  d char *)(y)]   
66b0: 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74    \.&& sqlite3St
66c0: 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b  rICmp((x)+1,(y)+
66d0: 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41  1)==0 )../*.** A
66e0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
66f0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
6700: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
6710: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
6720: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
6730: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
6740: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
6750: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
6760: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
6770: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
6780: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
6790: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
67a0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
67b0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
67c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
67d0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
67e0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
67f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6800: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
6810: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
6820: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
6830: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
6840: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
6850: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
6860: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6870: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
6880: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
6890: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
68a0: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
68b0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
68c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
68d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52  ++){.    if( STR
68e0: 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  ICMP(z, p->aCol[
68f0: 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  i].zName) ){.   
6900: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6910: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
6920: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
6930: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
6940: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
6950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
6960: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
6970: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
6980: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
6990: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
69a0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
69b0: 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43   p->aCol, (p->nC
69c0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
69d0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
69e0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
69f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6a00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
6a10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
6a20: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
6a30: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
6a40: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
6a50: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
6a60: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
6a70: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
6a80: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
6a90: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
6aa0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
6ab0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
6ac0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
6ad0: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
6ae0: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
6af0: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
6b00: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
6b10: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
6b20: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
6b30: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
6b40: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
6b50: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
6b60: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
6b70: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70  _NONE;.  pCol->p
6b80: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
6b90: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
6ba0: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
6bb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
6bd0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
6be0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
6bf0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
6c00: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6c10: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
6c20: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
6c30: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
6c40: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
6c50: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6c60: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
6c70: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
6c80: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
6c90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
6ca0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6cb0: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
6cc0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
6cd0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
6ce0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
6cf0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
6d00: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
6d10: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
6d20: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
6d30: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
6d40: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
6d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
6d60: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
6d70: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
6d80: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
6d90: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
6da0: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
6db0: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
6dc0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
6dd0: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
6de0: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
6df0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
6e00: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
6e10: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
6e20: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
6e30: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
6e40: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
6e50: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
6e60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
6e70: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
6e80: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
6e90: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
6ea0: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
6eb0: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
6ec0: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
6ed0: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
6ee0: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
6ef0: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
6f00: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
6f10: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
6f20: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
6f30: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
6f40: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
6f70: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
6f80: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
6f90: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
6fa0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
6fb0: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
6fc0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
6fd0: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
6fe0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
6ff0: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
7000: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7010: 46 46 5f 4e 4f 4e 45 0a 2a 2a 0a 2a 2a 20 49 66  FF_NONE.**.** If
7020: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
7030: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
7040: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
7050: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
7060: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
7070: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
7080: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
7090: 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e  Type(const Token
70a0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20   *pType){.  u32 
70b0: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
70c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
70d0: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
70e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
70f0: 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20  In = pType->z;. 
7100: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7110: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54  char *zEnd = &pT
7120: 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d  ype->z[pType->n]
7130: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21  ;..  while( zIn!
7140: 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d  =zEnd ){.    h =
7150: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
7160: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a  3UpperToLower[*z
7170: 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  In];.    zIn++;.
7180: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
7190: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
71a0: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
71c0: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
71d0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
71e0: 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20  EXT; .    }else 
71f0: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7200: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
7210: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
7220: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
7230: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7240: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
7250: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
7260: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
7270: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
7280: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
7290: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
72a0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
72b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
72c0: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
72d0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
72e0: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
72f0: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
7300: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
7310: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
7320: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7330: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
7340: 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30  else if( (h&0x00
7350: 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c  FFFFFF)==(('i'<<
7360: 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27  16)+('n'<<8)+'t'
7370: 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a  ) ){    /* INT *
7380: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7390: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
73a0: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
73b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
73c0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
73d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
73e0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
73f0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
7400: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7410: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7420: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7430: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
7440: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
7450: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
7460: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
7470: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
7480: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
7490: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
74a0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
74b0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
74c0: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
74d0: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
74e0: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
74f0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
7500: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
7510: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
7520: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
7530: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
7540: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
7550: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
7560: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
7570: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
7580: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7590: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
75a0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
75b0: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
75c0: 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  Col;..  if( (p =
75d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
75e0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
75f0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
7600: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
7610: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
7620: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 61 73  p->aCol[i];.  as
7630: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70  sert( pCol->zTyp
7640: 65 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e  e==0 );.  pCol->
7650: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e  zType = sqlite3N
7660: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 79  ameFromToken(pTy
7670: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
7680: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
7690: 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70  ffinityType(pTyp
76a0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
76b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
76c0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
76d0: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
76e0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
76f0: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
7700: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
7710: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
7720: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
7730: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
7740: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
7750: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
7760: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
7770: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
7780: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
7790: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
77a0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
77b0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
77c0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
77d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
77e0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
77f0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
7800: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
7810: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7820: 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Expr){.  Table *
7830: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
7840: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
7850: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7860: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
7870: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
7880: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
7890: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
78a0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
78b0: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
78c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
78d0: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
78e0: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
78f0: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
7900: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
7910: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
7920: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7930: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
7940: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
7950: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  );.      pCol->p
7960: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
7970: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
7980: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
7990: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
79a0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
79b0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
79c0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
79d0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
79e0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
79f0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
7a00: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
7a10: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
7a20: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
7a30: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
7a40: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
7a50: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
7a60: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
7a70: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
7a80: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
7a90: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
7aa0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
7ab0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
7ac0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
7ad0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
7ae0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
7af0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
7b00: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
7b10: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
7b20: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
7b30: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
7b40: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
7b50: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
7b60: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
7b70: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
7b80: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
7b90: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
7ba0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
7bb0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
7bc0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
7bd0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
7be0: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
7bf0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
7c00: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
7c10: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
7c20: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
7c30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
7c50: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
7c60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7c70: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
7c80: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
7c90: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
7ca0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
7cb0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
7cc0: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
7cd0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
7ce0: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
7cf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
7d00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7d10: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7d20: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
7d30: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
7d40: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
7d50: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
7d60: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
7d70: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
7d80: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
7d90: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 20 20 20    int autoInc   
7da0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
7db0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
7dc0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
7dd0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
7de0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
7df0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
7e00: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
7e10: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
7e20: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
7e30: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
7e40: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
7e50: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
7e60: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
7e70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7e80: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
7e90: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
7ea0: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
7eb0: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
7ec0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
7ed0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
7ee0: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
7ef0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
7f00: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
7f10: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
7f20: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
7f30: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
7f40: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
7f50: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
7f60: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
7f70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7f80: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
7f90: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
7fa0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
7fb0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
7fc0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7fd0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
7fe0: 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l].zName)==0 ){.
7ff0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8000: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8010: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
8020: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70  l<pTab->nCol ) p
8030: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8040: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
8050: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
8060: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
8070: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
8080: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
8090: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
80a0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
80b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
80c0: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
80d0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
80e0: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
80f0: 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20  NTEGER")==0 ){. 
8100: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
8110: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
8120: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
8130: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
8140: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
8150: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
8160: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
8170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8180: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
8190: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
81a0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
81b0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
81c0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
81d0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
81e0: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
81f0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
8200: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
8210: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
8220: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
8230: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  or, 0, 0);.    p
8240: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
8250: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
8260: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
8270: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
8280: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
8290: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
82a0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
82b0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
82c0: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
82d0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
82e0: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
82f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8300: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
8310: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
8320: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
8330: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54   int nType){.  T
8340: 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78  able *p;.  Index
8350: 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65   *pIdx;.  CollSe
8360: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
8370: 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  i;..  if( (p = p
8380: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8390: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
83a0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
83b0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
83c0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
83d0: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e  pParse, zType, n
83e0: 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c  Type);.  p->aCol
83f0: 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  [i].pColl = pCol
8400: 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  l;..  /* If the 
8410: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
8420: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
8430: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
8440: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20  E <type>",.  ** 
8450: 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61  then an index ma
8460: 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61  y have been crea
8470: 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75  ted on this colu
8480: 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  mn before the.  
8490: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
84a0: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
84b0: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
84c0: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
84d0: 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70  /.  for(pIdx = p
84e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
84f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
8500: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8510: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
8520: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
8530: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
8540: 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  ) pIdx->keyInfo.
8550: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c  aColl[0] = pColl
8560: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
8570: 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b  all sqlite3Check
8580: 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c  CollSeq() for al
8590: 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  l collating sequ
85a0: 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65  ences in an inde
85b0: 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  x,.** in order t
85c0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
85d0: 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  l the necessary 
85e0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
85f0: 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65  ces are.** loade
8600: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
8610: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
8620: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
8630: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
8640: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
8650: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
8660: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
8670: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
8680: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68     if( sqlite3Ch
8690: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
86a0: 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  e, pIdx->keyInfo
86b0: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20  .aColl[i]) ){.  
86c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
86d0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
86e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
86f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
8710: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8720: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8730: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
8740: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
8750: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
8760: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
8770: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
8780: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
8790: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
87a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
87b0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
87c0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
87d0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
87e0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
87f0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
8800: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
8810: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
8820: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
8830: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
8840: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
8850: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
8860: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
8870: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
8880: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
8890: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
88a0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
88b0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
88c0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
88d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
88e0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
88f0: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
8900: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
8910: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
8920: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
8930: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
8940: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8950: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
8960: 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53  pParse..*/.CollS
8970: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
8980: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
8990: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
89a0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
89b0: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
89c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
89d0: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 64 62  b;.  u8 enc = db
89e0: 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74  ->enc;.  u8 init
89f0: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
8a00: 62 75 73 79 3b 0a 0a 20 20 43 6f 6c 6c 53 65 71  busy;..  CollSeq
8a10: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
8a20: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
8a30: 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61   enc, zName, nNa
8a40: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
8a50: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
8a60: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
8a70: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
8a80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
8a90: 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20  3GetCollSeq(db, 
8aa0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  pColl, zName, nN
8ab0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ame);.    if( !p
8ac0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Coll ){.      if
8ad0: 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20  ( nName<0 ){.   
8ae0: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72       nName = str
8af0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
8b00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8b10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8b20: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
8b30: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
8b40: 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  .*s", nName, zNa
8b50: 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  me);.      pColl
8b60: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
8b70: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
8b80: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
8b90: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
8ba0: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
8bb0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
8bc0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
8bd0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
8be0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
8bf0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
8c00: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8c10: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
8c20: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
8c30: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
8c40: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
8c50: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
8c60: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
8c70: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
8c80: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
8c90: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
8ca0: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
8cb0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
8cc0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
8cd0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
8ce0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
8cf0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
8d00: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
8d10: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
8d20: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
8d30: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
8d40: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
8d50: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
8d60: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
8d70: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
8d80: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
8d90: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
8da0: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
8db0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
8dc0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
8dd0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
8de0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
8df0: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
8e00: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
8e10: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
8e20: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
8e30: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
8e40: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
8e50: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
8e60: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73  e3ChangeCookie(s
8e70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
8e80: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
8e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ea0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
8eb0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63   db->aDb[iDb].sc
8ec0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30  hema_cookie+1, 0
8ed0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
8ee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
8ef0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a  ookie, iDb, 0);.
8f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
8f10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
8f20: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
8f30: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
8f40: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
8f50: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
8f60: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
8f70: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
8f80: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
8f90: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
8fa0: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
8fb0: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
8fc0: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
8fd0: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
8fe0: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
8ff0: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
9000: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
9010: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
9020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
9030: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
9040: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
9050: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
9060: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
9070: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
9080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
9090: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  an identifier on
90a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
90b0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20  e given string. 
90c0: 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68   Add.** quote ch
90d0: 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64  aracters as need
90e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
90f0: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
9100: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
9110: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
9120: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
9130: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
9140: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
9150: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
9160: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
9170: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
9180: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
9190: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
91a0: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
91b0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
91c0: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
91d0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
91e0: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
91f0: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
9200: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
9210: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
9220: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
9230: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
9240: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
9250: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
9260: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
9270: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
9280: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
9290: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
92a0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
92b0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
92c0: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
92d0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
92e0: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
92f0: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
9300: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
9310: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9320: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
9330: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
9340: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
9350: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
9360: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
9370: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
9380: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
9390: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
93a0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
93b0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
93c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
93d0: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
93e0: 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20  tmt(Table *p){. 
93f0: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
9400: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
9410: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
9420: 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20  2, *zEnd, *z;.  
9430: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
9440: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
9450: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
9460: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
9470: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
9480: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
9490: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
94a0: 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70    z = pCol->zTyp
94b0: 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  e;.    if( z ){.
94c0: 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c        n += (strl
94d0: 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  en(z) + 1);.    
94e0: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
94f0: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
9500: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
9510: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
9520: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
9530: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
9540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9550: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
9560: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
9570: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
9580: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
9590: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
95a0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
95b0: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
95c0: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
95d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
95e0: 63 70 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54  cpy(zStmt, !OMIT
95f0: 5f 54 45 4d 50 44 42 26 26 70 2d 3e 69 44 62 3d  _TEMPDB&&p->iDb=
9600: 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d  =1 ? "CREATE TEM
9610: 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41 54  P TABLE ":"CREAT
9620: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
9630: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b  = strlen(zStmt);
9640: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
9650: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
9660: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
9670: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
9680: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
9690: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
96a0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63  Col++){.    strc
96b0: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  py(&zStmt[k], zS
96c0: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74  ep);.    k += st
96d0: 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  rlen(&zStmt[k]);
96e0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
96f0: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
9700: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
9710: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
9720: 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70   (z = pCol->zTyp
9730: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  e)!=0 ){.      z
9740: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b  Stmt[k++] = ' ';
9750: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
9760: 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20  Stmt[k], z);.   
9770: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a     k += strlen(z
9780: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
9790: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
97a0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
97b0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
97c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
97d0: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
97e0: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
97f0: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
9800: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
9810: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
9820: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
9830: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
9840: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
9850: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
9860: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
9870: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
9880: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
9890: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
98a0: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
98b0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
98c0: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
98d0: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
98e0: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
98f0: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
9900: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
9910: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
9920: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
9930: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
9940: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
9950: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
9960: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
9970: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
9980: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
9990: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
99a0: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
99b0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
99c0: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
99d0: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c  ecently changed,
99e0: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
99f0: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
9a00: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
9a10: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
9a20: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
9a30: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
9a40: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
9a50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
9a60: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
9a70: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
9a80: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
9a90: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
9aa0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
9ab0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
9ac0: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
9ad0: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
9ae0: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
9af0: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
9b00: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
9b10: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
9b20: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
9b30: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
9b40: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
9b50: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20  ite3EndTable(.  
9b60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9b70: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
9b80: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
9b90: 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20  ken *pCons,     
9ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27        /* The ','
9bb0: 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65   token after the
9bc0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66   last column def
9bd0: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
9be0: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
9bf0: 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27  /* The final ')'
9c00: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52   token in the CR
9c10: 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
9c20: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
9c30: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
9c40: 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45  t from a "CREATE
9c50: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20   ... AS SELECT" 
9c60: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
9c70: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9c80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
9c90: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
9ca0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
9cb0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
9cc0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
9cd0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
9ce0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9cf0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9d00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
9d10: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
9d20: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
9d30: 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ect );..  /* If 
9d40: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
9d50: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
9d60: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
9d70: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
9d80: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
9d90: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
9da0: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
9db0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
9dc0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
9dd0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
9de0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
9df0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
9e00: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
9e10: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
9e20: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
9e30: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
9e40: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
9e50: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
9e60: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
9e70: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
9e80: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
9e90: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
9ea0: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
9eb0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
9ec0: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
9ed0: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
9ee0: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
9ef0: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
9f00: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
9f10: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
9f20: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
9f30: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
9f40: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20   record number. 
9f50: 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
9f60: 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75  table entry shou
9f70: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e  ld already be on
9f80: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
9f90: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
9fa0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
9fb0: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
9fc0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
9fd0: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
9fe0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
9ff0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
a000: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
a010: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
a020: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
a030: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
a040: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
a050: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
a060: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
a070: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
a080: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
a090: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
a0a0: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
a0b0: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
a0c0: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
a0d0: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
a0e0: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
a0f0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a100: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
a110: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
a120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a130: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
a140: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
a150: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
a160: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
a170: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
a180: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
a190: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
a1a0: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
a1b0: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
a1c0: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
a1d0: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
a1e0: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
a1f0: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
a200: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
a210: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
a220: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
a230: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
a240: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
a250: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
a260: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
a270: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a280: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
a290: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a2a0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
a2b0: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
a2c0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
a2d0: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
a2e0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a2f0: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
a300: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
a310: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
a320: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
a330: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
a340: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
a350: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
a360: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
a370: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
a380: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
a390: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
a3a0: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
a3b0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
a3c0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
a3d0: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
a3e0: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
a3f0: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
a400: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
a410: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
a420: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
a430: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
a440: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
a450: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a460: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
a470: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
a480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a490: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
a4a0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
a4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a4c0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
a4d0: 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20   p->iDb, 0);.   
a4e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a4f0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
a500: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
a510: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
a520: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
a530: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
a540: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62  pSelect, SRT_Tab
a550: 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20  le, 1, 0, 0, 0, 
a560: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a570: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a580: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
a590: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a5a0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
a5b0: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
a5c0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
a5d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
a5e0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
a5f0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
a600: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a620: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
a630: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
a640: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
a650: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
a660: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
a670: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
a680: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
a690: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
a6a0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
a6b0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
a6c0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
a6d0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a6e0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
a6f0: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
a700: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
a710: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
a720: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
a730: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
a740: 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d  leStmt(p);.    }
a750: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
a760: 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65  pEnd->z - pParse
a770: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b  ->sNameToken.z +
a780: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
a790: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
a7a0: 28 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73  ("CREATE %s %.*s
a7b0: 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
a7c0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
a7d0: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .z);.    }..    
a7e0: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
a7f0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
a800: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
a810: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
a820: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
a830: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
a840: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
a850: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
a860: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
a870: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
a880: 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20  collected.  The 
a890: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70 72  rowid for the pr
a8a0: 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a  eallocated.    *
a8b0: 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e  * slot is the 2n
a8c0: 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  d item on the st
a8d0: 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66  ack.  The top of
a8e0: 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68   the stack is th
a8f0: 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
a900: 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ge for the new t
a910: 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20  able (or a 0 if 
a920: 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29 2e  this is a view).
a930: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
a940: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
a950: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
a960: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
a970: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
a980: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
a990: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
a9a0: 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20  page=#0, sql=%Q 
a9b0: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
a9c0: 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20 20  rowid=#1",.     
a9d0: 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d   db->aDb[p->iDb]
a9e0: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
a9f0: 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20  ABLE(p->iDb),.  
aa00: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
aa10: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
aa20: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
aa30: 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
aa40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74    sqliteFree(zSt
aa50: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
aa60: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
aa70: 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 23 69   v, p->iDb);..#i
aa80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aa90: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
aaa0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
aab0: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
aac0: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
aad0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
aae0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
aaf0: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
ab00: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
ab10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ab20: 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20   p->autoInc ){. 
ab30: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
ab40: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b  db->aDb[p->iDb];
ab50: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
ab60: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
ab70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
ab80: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
ab90: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
aba0: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
abb0: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
abc0: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
abd0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
abe0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
abf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
ac00: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
ac10: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
ac20: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
ac30: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
ac40: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
ac50: 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
ac60: 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20  Schema, p->iDb, 
ac70: 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0,.        sqlit
ac80: 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e  e3MPrintf("tbl_n
ac90: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
aca0: 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
acb0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
acc0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
acd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
ace0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
acf0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
ad00: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
ad10: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
ad20: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
ad30: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
ad40: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20  FKey *pFKey; .  
ad50: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
ad60: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
ad70: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
ad80: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
ad90: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
ada0: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
adb0: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
adc0: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
add0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
ade0: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
adf0: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
ae00: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
ae10: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
ae20: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  turn;.    }.#ifn
ae30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ae40: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
ae50: 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b  for(pFKey=p->pFK
ae60: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
ae70: 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f  =pFKey->pNextFro
ae80: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
ae90: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
aea0: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
aeb0: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
aec0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
aed0: 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  nd(&pDb->aFKey, 
aee0: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  pFKey->zTo, nTo)
aef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48  ;.      sqlite3H
af00: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
af10: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
af20: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
af30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
af40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
af50: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
af60: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
af70: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
af80: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
af90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
afa0: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
afb0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
afc0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 61 73  lect ){.      as
afd0: 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
afe0: 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
aff0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
b000: 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70 43 6f 6e 73  ns->z==0 ) pCons
b010: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
b020: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
b030: 20 31 33 20 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20   13 + (pCons->z 
b040: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
b050: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23  oken.z);.    }.#
b060: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
b070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b080: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
b090: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
b0a0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
b0b0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
b0c0: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
b0d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
b0e0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
b0f0: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
b100: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b110: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
b120: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
b130: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
b140: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
b150: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
b160: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
b170: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b180: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b190: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
b1a0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
b1b0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
b1c0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
b1d0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
b1e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b1f0: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
b200: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
b210: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
b220: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
b230: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
b240: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
b250: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
b260: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
b270: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
b280: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
b290: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
b2a0: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
b2b0: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
b2c0: 65 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  e;..  if( pParse
b2d0: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
b2e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b2f0: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
b300: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
b310: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
b320: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b330: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
b340: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b350: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
b360: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42  Table(pParse, pB
b370: 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  egin, pName1, pN
b380: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29  ame2, isTemp, 1)
b390: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
b3a0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
b3b0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
b3c0: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
b3d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
b3e0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
b3f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
b400: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
b410: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
b420: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
b430: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
b440: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
b450: 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69  rse, p->iDb, "vi
b460: 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20  ew", pName).    
b470: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  && sqlite3FixSel
b480: 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
b490: 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ct).  ){.    sql
b4a0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
b4b0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
b4c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
b4d0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
b4e0: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
b4f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
b500: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
b510: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
b520: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
b530: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
b540: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
b550: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
b560: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
b570: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
b580: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
b590: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
b5a0: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
b5b0: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
b5c0: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
b5d0: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
b5e0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
b5f0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
b600: 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74  electDup(pSelect
b610: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
b620: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b630: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
b640: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
b650: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
b660: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
b670: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
b680: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
b690: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
b6a0: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
b6b0: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
b6c0: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
b6d0: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
b6e0: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
b6f0: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
b700: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
b710: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
b720: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
b730: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
b740: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45  .n = 0;.  n = sE
b750: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
b760: 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75  ;.  z = (const u
b770: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
b780: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
b790: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
b7a0: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
b7b0: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
b7c0: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
b7d0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
b7e0: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
b7f0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
b800: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
b810: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
b820: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
b830: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
b840: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
b850: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
b860: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b870: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
b880: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b890: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
b8a0: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
b8b0: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
b8c0: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
b8d0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
b8e0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
b8f0: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
b900: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
b910: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
b920: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
b930: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
b940: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
b950: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
b960: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
b970: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
b980: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
b990: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
b9a0: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
b9b0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
b9c0: 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
b9d0: 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
b9e0: 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
b9f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
ba00: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
ba10: 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
ba20: 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
ba30: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
ba40: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
ba50: 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
ba60: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
ba70: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
ba80: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
ba90: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
baa0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
bab0: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
bac0: 73 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73  signed */..  ass
bad0: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
bae0: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
baf0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
bb00: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
bb10: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
bb20: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
bb30: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
bb40: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
bb50: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
bb60: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
bb70: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
bb80: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
bb90: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
bba0: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
bbb0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
bbc0: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
bbd0: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
bbe0: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
bbf0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
bc00: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
bc10: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
bc20: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
bc30: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
bc40: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
bc50: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
bc60: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
bc70: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
bc80: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
bc90: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
bca0: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
bcb0: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
bcc0: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
bcd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
bce0: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
bcf0: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
bd00: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
bd10: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
bd20: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
bd30: 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 54 61  .#if 0.  if( pTa
bd40: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
bd50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bd60: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
bd70: 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
bd80: 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
bd90: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
bda0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65  return 1;.  }.#e
bdb0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
bdc0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
bdd0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
bde0: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
bdf0: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
be00: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
be10: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
be20: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
be30: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
be40: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
be50: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
be60: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
be70: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
be80: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
be90: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
bea0: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
beb0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
bec0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
bed0: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
bee0: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
bef0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
bf00: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
bf10: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
bf20: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
bf30: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
bf40: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
bf50: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
bf60: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
bf70: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
bf80: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
bf90: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
bfa0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
bfb0: 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
bfc0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  Tab;.  sqlite3Sr
bfd0: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
bfe0: 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
bff0: 3e 70 53 72 63 29 3b 0a 20 20 70 54 61 62 6c 65  >pSrc);.  pTable
c000: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70  ->nCol = -1;.  p
c010: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
c020: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
c030: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
c040: 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  l);.  pParse->nT
c050: 61 62 20 3d 20 6e 3b 0a 20 20 69 66 28 20 70 53  ab = n;.  if( pS
c060: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  elTab ){.    ass
c070: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
c080: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  l==0 );.    pTab
c090: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
c0a0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54  ab->nCol;.    pT
c0b0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
c0c0: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
c0d0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
c0e0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
c0f0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
c100: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
c110: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
c120: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
c130: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c140: 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65  le->iDb, DB_Unre
c150: 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c  setViews);.  }el
c160: 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  se{.    pTable->
c170: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45  nCol = 0;.    nE
c180: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rr++;.  }.  sqli
c190: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c1a0: 70 53 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSel);.  return 
c1b0: 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
c1c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c1d0: 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  VIEW */..#ifndef
c1e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c1f0: 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
c200: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
c210: 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
c220: 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
c230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c240: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
c250: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
c260: 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
c270: 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44  lem *i;.  if( !D
c280: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
c290: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
c2a0: 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
c2b0: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
c2c0: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
c2d0: 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b  b[idx].tblHash);
c2e0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
c2f0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
c300: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
c310: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
c320: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
c330: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
c340: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
c350: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
c360: 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
c370: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
c380: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
c390: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
c3a0: 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
c3b0: 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
c3c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c3d0: 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
c3e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
c3f0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
c400: 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
c410: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
c420: 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
c430: 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
c440: 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
c450: 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
c460: 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
c470: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
c480: 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
c490: 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
c4a0: 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
c4b0: 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66  * to iTo..*/.#if
c4c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c4d0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
c4e0: 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
c4f0: 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69  Moved(Db *pDb, i
c500: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
c510: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
c520: 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72 28  pElem;.  .  for(
c530: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
c540: 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48  First(&pDb->tblH
c550: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
c560: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
c570: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
c580: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c590: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
c5a0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
c5b0: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
c5c0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
c5d0: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72  m = iTo;.      r
c5e0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
c5f0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
c600: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
c610: 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45 6c  b->idxHash); pEl
c620: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
c630: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
c640: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
c650: 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
c660: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
c670: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
c680: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
c690: 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
c6a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c6b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
c6c0: 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  (0);.}.#endif../
c6d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
c6e0: 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
c6f0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
c700: 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
c710: 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
c720: 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
c730: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
c740: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
c750: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
c760: 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
c770: 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
c780: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
c790: 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
c7a0: 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
c7b0: 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
c7c0: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
c7d0: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
c7e0: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
c7f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
c800: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
c810: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
c820: 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
c830: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
c840: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c850: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
c860: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
c870: 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
c880: 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  iDb);.#ifndef SQ
c890: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
c8a0: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
c8b0: 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69  troy pushes an i
c8c0: 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20  nteger onto the 
c8d0: 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69  stack. If this i
c8e0: 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
c8f0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
c900: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
c910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
c920: 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
c930: 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
c940: 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
c950: 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
c960: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
c970: 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
c980: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
c990: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20  *.  ** The "#0" 
c9a0: 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  in the SQL is a 
c9b0: 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74  special constant
c9c0: 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74   that means what
c9d0: 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ever value.  ** 
c9e0: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
c9f0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65   the stack.  See
ca00: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
ca10: 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  Expr()..  */.  s
ca20: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
ca30: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
ca40: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
ca50: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
ca60: 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70  ERE #0 AND rootp
ca70: 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50  age=#0",.     pP
ca80: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
ca90: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
caa0: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
cab0: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ble);.#endif.}..
cac0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
cad0: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
cae0: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
caf0: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
cb00: 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
cb10: 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
cb20: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
cb30: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
cb40: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
cb50: 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
cb60: 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
cb70: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
cb80: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
cb90: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
cba0: 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
cbb0: 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
cbc0: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
cbd0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
cbe0: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
cbf0: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
cc00: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
cc10: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
cc20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
cc30: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
cc40: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
cc50: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
cc60: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
cc70: 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  um, pTab->iDb);.
cc80: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
cc90: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
cca0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ccb0: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
ccc0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
ccd0: 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e  dx->tnum, pIdx->
cce0: 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
ccf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
cd00: 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
cd10: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
cd20: 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
cd30: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
cd40: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
cd50: 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
cd60: 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
cd70: 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
cd80: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
cd90: 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
cda0: 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
cdb0: 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
cdc0: 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
cdd0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
cde0: 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
cdf0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
ce00: 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
ce10: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
ce20: 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
ce30: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
ce40: 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
ce50: 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
ce60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
ce70: 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
ce80: 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
ce90: 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
cea0: 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
ceb0: 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
cec0: 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
ced0: 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
cee0: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
cef0: 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
cf00: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
cf10: 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
cf20: 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
cf30: 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
cf40: 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
cf50: 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
cf60: 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
cf70: 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
cf80: 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
cf90: 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
cfa0: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
cfb0: 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
cfc0: 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
cfd0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
cfe0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
cff0: 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
d000: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
d010: 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
d020: 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
d030: 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
d040: 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
d050: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
d060: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d070: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
d080: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
d090: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
d0a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
d0b0: 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44  x->iDb==pTab->iD
d0c0: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  b );.      if( (
d0d0: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
d0e0: 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
d0f0: 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
d100: 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
d110: 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
d120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d130: 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
d140: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d150: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d160: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
d170: 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  t, pTab->iDb);. 
d180: 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
d190: 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23 65  iLargest;.  }.#e
d1a0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
d1b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d1c0: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
d1d0: 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
d1e0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
d1f0: 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
d200: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
d210: 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
d220: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
d230: 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
d240: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
d250: 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
d260: 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ew){.  Table *pT
d270: 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
d280: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d290: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d2a0: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
d2b0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
d2c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
d2d0: 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  ed ) goto exit_d
d2e0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73  rop_table;.  ass
d2f0: 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
d300: 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  ==1 );.  pTab = 
d310: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
d320: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
d330: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
d340: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
d350: 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  ase);..  if( pTa
d360: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
d370: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69  _drop_table;.  i
d380: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
d390: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
d3a0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
d3b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
d3c0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
d3d0: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
d3e0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
d3f0: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
d400: 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d  HEMA_TABLE(pTab-
d410: 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  >iDb);.    const
d420: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
d430: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
d440: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
d450: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
d460: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
d470: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
d480: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
d490: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
d4a0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
d4b0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
d4c0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
d4d0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
d4e0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
d4f0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
d500: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
d510: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
d520: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
d530: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
d540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
d550: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
d560: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
d570: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
d580: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
d590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d5a0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
d5b0: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
d5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d5d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
d5e0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
d5f0: 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
d600: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
d610: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
d620: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
d630: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
d640: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
d650: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
d660: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
d670: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
d680: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
d690: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
d6a0: 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  dif.  if( pTab->
d6b0: 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62  readOnly || pTab
d6c0: 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ==db->aDb[iDb].p
d6d0: 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71  SeqTab ){.    sq
d6e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d6f0: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
d700: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
d710: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
d720: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
d730: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
d740: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d750: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
d760: 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
d770: 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
d780: 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
d790: 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
d7a0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
d7b0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
d7c0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
d7d0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
d7e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d7f0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
d800: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
d810: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
d820: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
d830: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
d840: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
d850: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
d860: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d870: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d880: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
d890: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
d8a0: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
d8b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
d8c0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
d8d0: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
d8e0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
d8f0: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
d900: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
d910: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
d920: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
d930: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
d940: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
d950: 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67  f( v ){.    Trig
d960: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
d970: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 54 61     int iDb = pTa
d980: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62 20 2a  b->iDb;.    Db *
d990: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
d9a0: 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db];.    sqlite3
d9b0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
d9c0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
d9d0: 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  Db);..    /* Dro
d9e0: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
d9f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
da00: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
da10: 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20  ropped. Code.   
da20: 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
da30: 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
da40: 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
da50: 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20  aster and/or.   
da60: 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
da70: 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
da80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
da90: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e  Trigger = pTab->
daa0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68  pTrigger;.    wh
dab0: 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
dac0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
dad0: 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 69 44  Trigger->iDb==iD
dae0: 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69  b || pTrigger->i
daf0: 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  Db==1 );.      s
db00: 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
db10: 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
db20: 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  igger, 1);.     
db30: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
db40: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
db50: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
db60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
db70: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d  EMENT.    /* Rem
db80: 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
db90: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
dba0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
dbb0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
dbc0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
dbd0: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
dbe0: 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
dbf0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
dc00: 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20  opped.    ** at 
dc10: 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
dc20: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
dc30: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
dc40: 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  le needs to.    
dc50: 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
dc60: 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
dc70: 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
dc80: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
dc90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
dca0: 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29   pTab->autoInc )
dcb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
dcc0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
dcd0: 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
dce0: 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74  TE FROM %s.sqlit
dcf0: 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
dd00: 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
dd10: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
dd20: 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
dd30: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
dd40: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
dd50: 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
dd60: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
dd70: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
dd80: 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
dd90: 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
dda0: 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
ddb0: 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
ddc0: 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
ddd0: 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
dde0: 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
ddf0: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
de00: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
de10: 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
de20: 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
de30: 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
de40: 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
de50: 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
de60: 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
de70: 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
de80: 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
de90: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
dea0: 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
deb0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
dec0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
ded0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
dee0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
def0: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
df00: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
df10: 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
df20: 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
df30: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45  pDb->zName, SCHE
df40: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
df50: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
df60: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
df70: 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62        destroyTab
df80: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
df90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
dfa0: 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
dfb0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69   entry from SQLi
dfc0: 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63  te's internal sc
dfd0: 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a  hema and modify.
dfe0: 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
dff0: 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f  a cookie..    */
e000: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e010: 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op3(v, OP_DropTa
e020: 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61  ble, iDb, 0, pTa
e030: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
e040: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
e050: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
e060: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  );.  }.  sqliteV
e070: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
e080: 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70  iDb);..exit_drop
e090: 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
e0a0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
e0b0: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
e0c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e0d0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e0e0: 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
e0f0: 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
e100: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
e110: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
e120: 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
e130: 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
e140: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
e150: 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
e160: 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
e170: 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
e180: 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
e190: 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
e1a0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e1b0: 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
e1c0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
e1d0: 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
e1e0: 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
e1f0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
e200: 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
e210: 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
e220: 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
e230: 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
e240: 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
e250: 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
e260: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
e270: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
e280: 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
e290: 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
e2a0: 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
e2b0: 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
e2c0: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
e2d0: 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
e2e0: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
e2f0: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
e300: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
e310: 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
e320: 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
e330: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
e340: 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
e350: 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
e360: 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
e370: 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
e380: 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
e390: 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
e3a0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
e3b0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
e3c0: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
e3d0: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
e3e0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
e3f0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
e400: 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
e410: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
e420: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
e430: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
e440: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
e450: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
e460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e470: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e480: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
e490: 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
e4a0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
e4b0: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
e4c0: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
e4d0: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
e4e0: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
e4f0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
e500: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
e510: 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
e520: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
e530: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
e540: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
e550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
e560: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
e570: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
e580: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
e590: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
e5a0: 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
e5b0: 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  y = 0;.  Table *
e5c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
e5d0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
e5e0: 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
e5f0: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
e600: 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
e610: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
e620: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
e630: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
e640: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
e650: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
e660: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
e670: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
e680: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
e690: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
e6a0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
e6b0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
e6c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e6d0: 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
e6e0: 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
e6f0: 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
e700: 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
e710: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
e720: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
e730: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
e740: 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
e750: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
e760: 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
e770: 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
e780: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
e790: 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
e7a0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
e7b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e7c0: 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
e7d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
e7e0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
e7f0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
e800: 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
e810: 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
e820: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
e830: 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
e840: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
e850: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
e860: 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
e870: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
e880: 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a  (*pFKey) + nCol*
e890: 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
e8a0: 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
e8b0: 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
e8c0: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
e8d0: 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
e8e0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
e8f0: 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70  Byte += strlen(p
e900: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
e910: 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
e920: 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
e930: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
e940: 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
e950: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
e960: 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
e970: 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
e980: 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
e990: 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
e9a0: 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46  )&pFKey[1];.  pF
e9b0: 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72  Key->aCol = (str
e9c0: 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a  uct sColMap*)z;.
e9d0: 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74    z += sizeof(st
e9e0: 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43  ruct sColMap)*nC
e9f0: 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  ol;.  pFKey->zTo
ea00: 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
ea10: 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
ea20: 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
ea30: 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e   0;.  z += pTo->
ea40: 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  n+1;.  pFKey->pN
ea50: 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b  extTo = 0;.  pFK
ea60: 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
ea70: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
ea80: 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
ea90: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
eaa0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
eab0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
eac0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
ead0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
eae0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
eaf0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
eb00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
eb10: 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
eb20: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
eb30: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
eb40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
eb50: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
eb60: 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
eb70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
eb80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
eb90: 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
eba0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
ebb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ebc0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
ebd0: 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
ebe0: 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
ebf0: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
ec00: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
ec10: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
ec20: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
ec30: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
ec40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
ec50: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
ec60: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ec70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
ec80: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43   n = strlen(pToC
ec90: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
eca0: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
ecb0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
ecc0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
ecd0: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
ece0: 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
ecf0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
ed00: 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
ed10: 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
ed20: 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
ed30: 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d  ey->deleteConf =
ed40: 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20   flags & 0xff;. 
ed50: 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f   pFKey->updateCo
ed60: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38  nf = (flags >> 8
ed70: 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b   ) & 0xff;.  pFK
ed80: 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d  ey->insertConf =
ed90: 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20   (flags >> 16 ) 
eda0: 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69  & 0xff;..  /* Li
edb0: 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
edc0: 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
edd0: 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
ede0: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
edf0: 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
ee00: 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
ee10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46  .  sqliteFree(pF
ee20: 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
ee30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ee40: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
ee50: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
ee60: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  prListDelete(pFr
ee70: 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
ee80: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
ee90: 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
eea0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
eeb0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
eec0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
eed0: 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
eee0: 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
eef0: 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
ef00: 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
ef10: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
ef20: 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
ef30: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
ef40: 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
ef50: 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
ef60: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
ef70: 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
ef80: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
ef90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
efa0: 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
efb0: 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
efc0: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
efd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
efe0: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
eff0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
f000: 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
f010: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f020: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
f030: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
f040: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
f050: 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
f060: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
f070: 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
f080: 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
f090: 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  turn;.  pFKey->i
f0a0: 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65  sDeferred = isDe
f0b0: 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
f0c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f0d0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f0e0: 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
f0f0: 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
f100: 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
f110: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
f120: 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
f130: 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
f140: 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
f150: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
f160: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
f170: 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
f180: 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
f190: 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
f1a0: 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
f1b0: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
f1c0: 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
f1d0: 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63  d.  The memory c
f1e0: 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79  ell specified by
f1f0: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
f200: 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
f210: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
f220: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
f230: 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
f240: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
f250: 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
f260: 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
f270: 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
f280: 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
f290: 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
f2a0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f2b0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
f2c0: 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
f2d0: 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
f2e0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
f2f0: 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
f300: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
f310: 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
f320: 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
f330: 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
f340: 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
f350: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
f360: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
f370: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
f380: 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  >nTab;       /* 
f390: 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
f3a0: 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
f3b0: 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
f3c0: 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f  e->nTab+1;     /
f3d0: 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
f3e0: 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
f3f0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f420: 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
f430: 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
f460: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
f470: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
f480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
f490: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
f4a0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
f4b0: 63 68 69 6e 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  chine */..#ifnde
f4c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f4d0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
f4e0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
f4f0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
f500: 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
f510: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
f520: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
f530: 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
f540: 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
f550: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
f560: 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  f..  /* Ensure a
f570: 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ll the required 
f580: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
f590: 63 65 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ces are availabl
f5a0: 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 72 6f 75  e. This.  ** rou
f5b0: 74 69 6e 65 20 77 69 6c 6c 20 69 6e 76 6f 6b 65  tine will invoke
f5c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e   the collation-n
f5d0: 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69  eeded callback i
f5e0: 66 20 6e 65 63 65 73 73 61 72 79 20 28 61 6e 64  f necessary (and
f5f0: 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 68 61 73  .  ** if one has
f600: 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
f610: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  )..  */.  if( sq
f620: 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43  lite3CheckIndexC
f630: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
f640: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 72 65  Index) ){.    re
f650: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  turn;.  }..  v =
f660: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f670: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
f680: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f690: 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
f6a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f6b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f6c0: 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f  _MemLoad, memRoo
f6d0: 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74  tPage, 0);.    t
f6e0: 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  num = 0;.  }else
f6f0: 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
f700: 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73  dex->tnum;.    s
f710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f720: 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
f730: 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  m, pIndex->iDb);
f740: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
f750: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f760: 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e 69  teger, pIndex->i
f770: 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
f780: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
f790: 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
f7a0: 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  tnum,.          
f7b0: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
f7c0: 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
f7d0: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
f7e0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
f7f0: 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c 20  leForReading(v, 
f800: 69 54 61 62 2c 20 70 54 61 62 29 3b 0a 20 20 61  iTab, pTab);.  a
f810: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
f820: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
f830: 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
f840: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
f850: 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e  eIndexKey(v, pIn
f860: 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 66  dex, iTab);.  if
f870: 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
f880: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
f890: 20 20 69 6e 74 20 63 75 72 61 64 64 72 20 3d 20    int curaddr = 
f8a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f8b0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69  ntAddr(v);.    i
f8c0: 6e 74 20 61 64 64 72 32 20 3d 20 63 75 72 61 64  nt addr2 = curad
f8d0: 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr+4;.    sqlite
f8e0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
f8f0: 20 63 75 72 61 64 64 72 2d 31 2c 20 61 64 64 72   curaddr-1, addr
f900: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
f910: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
f920: 6f 77 69 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  owid, iTab, 0);.
f930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f940: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
f950: 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  m, 1, 0);.    sq
f960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f970: 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69  , OP_IsUnique, i
f980: 49 64 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  Idx, addr2);.   
f990: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
f9a0: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
f9b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f  TE_CONSTRAINT, O
f9c0: 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20 20 20 20  E_Abort,.       
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
f9e0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
f9f0: 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
fa00: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61  3_STATIC);.    a
fa10: 73 73 65 72 74 28 20 61 64 64 72 32 3d 3d 73 71  ssert( addr2==sq
fa20: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fa30: 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20  Addr(v) );.  }. 
fa40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa50: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
fa60: 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 73  t, iIdx, 0);.  s
fa70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fa80: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
fa90: 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
faa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fab0: 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c 69  2(v, addr1, sqli
fac0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
fad0: 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74 65  dr(v));.  sqlite
fae0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
faf0: 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30 29  _Close, iTab, 0)
fb00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
fb10: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
fb20: 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  , iIdx, 0);.}../
fb30: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
fb40: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
fb50: 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
fb60: 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
fb70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
fb80: 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
fb90: 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
fba0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
fbb0: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
fbc0: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
fbd0: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
fbe0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
fbf0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
fc00: 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
fc10: 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
fc20: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
fc30: 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
fc40: 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
fc50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fc60: 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
fc70: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
fc80: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
fc90: 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
fca0: 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
fcb0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
fcc0: 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
fcd0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
fce0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
fcf0: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
fd00: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
fd10: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
fd20: 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
fd30: 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
fd40: 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
fd50: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
fd60: 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
fd70: 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
fd80: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
fd90: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
fda0: 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
fdb0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
fdc0: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
fdd0: 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
fde0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
fdf0: 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
fe00: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
fe10: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
fe20: 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
fe30: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
fe40: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
fe50: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
fe60: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
fe70: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
fe80: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
fe90: 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
fea0: 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
feb0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
fec0: 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
fed0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
fee0: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
fef0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
ff00: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
ff10: 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
ff20: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
ff30: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
ff40: 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
ff50: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
ff60: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
ff70: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  en that begins a
ff80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
ff90: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
ffa0: 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20  en *pEnd        
ffb0: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
ffc0: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
ffd0: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
ffe0: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
fff0: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  *pTab = 0;   /* 
10000 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
10010 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
10020 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54  pIndex = 0; /* T
10030 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
10040 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
10050 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
10060 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
10070 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
10080 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
10090 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
100a0 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
100b0 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69  ;    /* For assi
100c0 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
100d0 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
100e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
100f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
10100 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
10110 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
10120 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
10130 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
10140 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
10150 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75  ame = 0; /* Unqu
10160 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
10170 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
10180 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ate */..  if( pP
10190 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
101a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
101b0 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
101c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
101d0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
101e0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
101f0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
10200 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
10210 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
10220 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
10230 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
10240 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
10250 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
10260 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
10270 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
10280 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
10290 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
102a0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
102b0 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
102c0 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
102d0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
102e0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
102f0 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
10300 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
10310 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
10320 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
10330 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
10340 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
10350 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10360 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  dex;..#ifndef SQ
10370 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
10380 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
10390 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
103a0 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
103b0 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c   if the the tabl
103c0 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
103d0 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
103e0 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
103f0 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  e to 1..    */. 
10400 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
10410 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
10420 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
10430 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32  ;.    if( pName2
10440 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30   && pName2->n==0
10450 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
10460 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ->iDb==1 ){.    
10470 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d    iDb = 1;.    }
10480 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
10490 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
104a0 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
104b0 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
104c0 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73  me) &&.        s
104d0 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
104e0 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
104f0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
10500 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
10510 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
10520 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
10530 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
10540 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
10550 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
10560 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
10570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
10580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
10590 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
105a0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
105b0 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
105c0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
105d0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
105e0 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
105f0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
10600 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10610 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
10620 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20  =pTab->iDb );.  
10630 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
10640 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
10650 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
10660 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
10670 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44    iDb = pTab->iD
10680 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  b;.  }..  if( pT
10690 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
106a0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
106b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
106c0 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
106d0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
106e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
106f0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
10700 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
10710 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
10720 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
10730 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
10740 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10750 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
10760 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
10770 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10780 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
10790 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
107a0 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
107b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
107c0 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
107d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
107e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
107f0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
10800 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
10810 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
10820 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
10830 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
10840 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
10850 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
10860 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
10870 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
10880 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
10890 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
108a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
108b0 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
108c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
108d0 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
108e0 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
108f0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
10900 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
10910 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
10920 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
10930 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
10940 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
10950 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
10960 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
10970 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
10980 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
10990 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
109a0 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
109b0 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
109c0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
109d0 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
109e0 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
109f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
10a00 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
10a10 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
10a20 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
10a30 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
10a40 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
10a50 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
10a60 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10a70 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
10a80 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
10a90 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10aa0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
10ab0 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
10ac0 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
10ad0 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
10ae0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
10af0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
10b00 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
10b10 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
10b20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
10b30 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
10b40 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
10b50 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
10b60 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
10b70 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
10b80 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
10b90 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
10ba0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51   */.      if( SQ
10bb0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
10bc0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
10bd0 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
10be0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10bf0 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61     if( (pISameNa
10c00 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  me = sqlite3Find
10c10 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
10c20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
10c30 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
10c40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10c50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
10c60 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
10c70 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
10c80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
10c90 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10cb0 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
10cc0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
10cd0 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
10ce0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10cf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10d00 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
10d10 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
10d20 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
10d30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
10d40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
10d70 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
10d80 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
10d90 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
10da0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
10db0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
10dc0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
10dd0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
10de0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
10df0 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  d",n);.    zName
10e00 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
10e10 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
10e20 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
10e30 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e  ndex_", pTab->zN
10e40 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  ame, zBuf, (char
10e50 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  *)0);.    if( zN
10e60 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
10e70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
10e90 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
10ea0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
10eb0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
10ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10ed0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
10ee0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
10ef0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
10f00 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
10f10 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
10f20 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
10f30 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
10f40 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
10f50 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
10f60 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10f70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
10f80 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
10f90 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
10fa0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
10fb0 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
10fc0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
10fd0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
10fe0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
10ff0 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
11000 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
11010 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
11020 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11030 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11040 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
11050 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
11060 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
11070 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
11080 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
11090 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
110a0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
110b0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
110c0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
110d0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
110e0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
110f0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
11100 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
11110 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
11120 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  llId.z = pTab->a
11130 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
11140 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
11150 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  lId.n = strlen(n
11160 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
11170 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
11180 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30  rListAppend(0, 0
11190 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
111a0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
111b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
111c0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
111d0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
111e0 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
111f0 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e  ure. .  */.  pIn
11200 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
11210 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  oc( sizeof(Index
11220 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ) + strlen(zName
11230 29 20 2b 20 31 20 2b 20 73 69 7a 65 6f 66 28 69  ) + 1 + sizeof(i
11240 6e 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  nt) +.          
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
11260 69 7a 65 6f 66 28 69 6e 74 29 2a 32 20 2b 20 73  izeof(int)*2 + s
11270 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29  izeof(CollSeq*))
11280 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  *pList->nExpr );
11290 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
112a0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
112b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
112c0 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d  index;.  pIndex-
112d0 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
112e0 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
112f0 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e  fo.aColl[pList->
11300 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78  nExpr];.  pIndex
11310 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e  ->aiRowEst = (un
11320 73 69 67 6e 65 64 2a 29 26 70 49 6e 64 65 78 2d  signed*)&pIndex-
11330 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d  >aiColumn[pList-
11340 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65  >nExpr];.  pInde
11350 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
11360 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  *)&pIndex->aiRow
11370 45 73 74 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  Est[pList->nExpr
11380 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49  +1];.  strcpy(pI
11390 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
113a0 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  me);.  pIndex->p
113b0 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
113c0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
113d0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
113e0 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
113f0 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  r = onError;.  p
11400 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
11410 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70   = pName==0;.  p
11420 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 44 62  Index->iDb = iDb
11430 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
11440 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
11450 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
11460 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
11470 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
11480 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
11490 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
114a0 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
114b0 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
114c0 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
114d0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
114e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
114f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
11500 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  +){.    for(j=0;
11510 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
11520 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
11530 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
11540 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
11550 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
11560 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
11570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11580 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
11590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
115a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
115b0 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20  table %s has no 
115c0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22  column named %s"
115d0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
115e0 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  zName, pList->a[
115f0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
11600 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11610 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
11620 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
11630 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  umn[i] = j;.    
11640 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
11650 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
11660 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b  ssert( pList->a[
11670 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  i].pExpr->pColl 
11680 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  );.      pIndex-
11690 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
116a0 5d 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ] = pList->a[i].
116b0 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pExpr->pColl;.  
116c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
116d0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
116e0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e  Coll[i] = pTab->
116f0 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
11700 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
11710 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
11720 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20  .aColl[i] );.   
11730 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
11740 75 73 79 20 26 26 20 0a 20 20 20 20 20 20 20 20  usy && .        
11750 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
11760 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64  Seq(pParse, pInd
11770 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11780 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20  l[i]) .    ){.  
11790 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
117a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
117b0 7d 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e  }.  }.  pIndex->
117c0 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d  keyInfo.nField =
117d0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
117e0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
117f0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
11800 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
11810 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
11820 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
11830 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
11840 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
11850 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
11860 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
11870 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
11880 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
11890 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
118a0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
118b0 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
118c0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
118d0 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
118e0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
118f0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
11900 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
11910 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
11920 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
11930 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
11940 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
11950 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
11960 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
11970 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
11980 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
11990 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
119a0 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
119b0 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
119c0 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
119d0 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
119e0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
119f0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
11a00 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
11a10 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
11a20 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
11a30 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
11a40 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
11a50 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
11a60 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
11a70 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
11a80 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
11a90 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
11aa0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
11ab0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11ac0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
11ad0 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
11ae0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75  assert( pIdx->au
11af0 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20  toIndex );.     
11b00 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
11b10 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
11b20 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
11b30 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70  pIdx->nColumn!=p
11b40 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
11b50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11b60 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
11b70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b  ->nColumn; k++){
11b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
11b90 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
11ba0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
11bb0 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
11bc0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6b       if( pIdx->k
11bd0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21  eyInfo.aColl[k]!
11be0 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  =pIndex->keyInfo
11bf0 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65 61  .aColl[k] ) brea
11c00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11c10 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43   if( k==pIdx->nC
11c20 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
11c30 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
11c40 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
11c50 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
11c60 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
11c70 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
11c80 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
11c90 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
11ca0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
11cb0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
11cc0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
11cd0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
11ce0 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
11cf0 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
11d00 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
11d10 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
11d20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
11d30 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
11d40 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
11d50 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
11d60 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
11d70 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
11d80 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
11d90 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
11da0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
11db0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
11dc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
11dd0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
11de0 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72  ed behaviour for
11df0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
11e00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11e10 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
11e20 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
11e30 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
11e40 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
11e50 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
11e60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11e70 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
11e80 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
11e90 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
11ea0 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
11eb0 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
11ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ed0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
11ee0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
11ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11f00 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
11f10 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
11f20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
11f40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11f50 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
11f60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
11f70 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
11f80 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
11f90 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
11fa0 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
11fb0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
11fc0 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
11fd0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
11fe0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
11ff0 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
12000 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
12010 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65  t(&db->aDb[pInde
12020 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  x->iDb].idxHash,
12030 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12040 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
12050 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
12060 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
12070 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
12080 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
12090 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
120a0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
120b0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
120c0 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  */.      goto ex
120d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
120e0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
120f0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
12100 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
12110 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
12120 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
12130 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
12140 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
12150 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
12160 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
12170 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
12180 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
12190 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
121a0 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
121b0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
121c0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
121d0 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
121e0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
121f0 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
12200 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
12210 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62    **.  ** The db
12220 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
12230 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
12240 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
12250 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
12260 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69   command.  db->i
12270 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68  nit.busy is 1 wh
12280 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73  en a database is
12290 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a   opened and .  *
122a0 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  * CREATE INDEX s
122b0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65  tatements are re
122c0 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ad out of the ma
122d0 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a  ster table.  In.
122e0 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20    ** the latter 
122f0 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61  case the index a
12300 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e  lready exists on
12310 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20   disk, which is 
12320 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  why.  ** we don'
12330 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61  t want to recrea
12340 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  te it..  **.  **
12350 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
12360 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
12370 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
12380 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   as a primary ke
12390 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  y.  ** or UNIQUE
123a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61   constraint of a
123b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
123c0 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
123d0 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
123e0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
123f0 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
12400 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
12410 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
12420 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
12430 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
12440 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
12450 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12460 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
12470 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  ;.    char *zStm
12480 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  t;.    int iMem 
12490 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
124a0 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
124b0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
124c0 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
124d0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
124e0 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f  te_index;..    /
124f0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
12500 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
12510 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
12520 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
12530 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
12540 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
12550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12560 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
12570 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  x, iDb, 0);.    
12580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12590 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
125a0 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20   iMem, 0);..    
125b0 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f  /* Gather the co
125c0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
125d0 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
125e0 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20  statement into. 
125f0 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
12600 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a  variable.    */.
12610 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26      if( pStart &
12620 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  & pEnd ){.      
12630 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78  /* A named index
12640 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
12650 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  t CREATE INDEX s
12660 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
12670 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
12680 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45  3MPrintf("CREATE
12690 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
126a0 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
126b0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
126c0 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20  " UNIQUE",.     
126d0 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61     pEnd->z - pNa
126e0 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20  me->z + 1,.     
126f0 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20     pName->z);.  
12700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12710 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
12720 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
12730 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
12740 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12750 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
12760 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
12770 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
12780 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
12790 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
127a0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
127b0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
127c0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
127d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
127e0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
127f0 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
12800 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
12810 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
12820 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  ,#0,%Q);",.     
12830 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
12840 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
12850 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
12860 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
12870 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
12880 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53  Name,.        zS
12890 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
128a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
128b0 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
128c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
128d0 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a  (zStmt);..    /*
128e0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
128f0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
12900 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
12910 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
12920 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
12930 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
12940 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
12950 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
12960 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
12970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
12980 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
12990 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
129a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
129b0 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
129c0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
129d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
129e0 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
129f0 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
12a00 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
12a10 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e  "name='%q'", pIn
12a20 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  dex->zName), P3_
12a30 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
12a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a50 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
12a60 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
12a70 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
12a80 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
12a90 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
12aa0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
12ab0 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
12ac0 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
12ad0 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
12ae0 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
12af0 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
12b00 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
12b10 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
12b20 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
12b30 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
12b40 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
12b50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
12b60 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
12b70 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
12b80 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
12b90 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
12ba0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
12bb0 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
12bc0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
12bd0 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
12be0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
12bf0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
12c00 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
12c10 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
12c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
12c30 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
12c40 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
12c50 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
12c60 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
12c70 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
12c80 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
12c90 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
12ca0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
12cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
12cc0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
12cd0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
12ce0 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
12cf0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
12d00 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
12d10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
12d20 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
12d30 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
12d40 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
12d50 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65  Index ){.    fre
12d60 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
12d70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
12d80 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
12d90 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
12da0 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e  ListDelete(pTblN
12db0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
12dc0 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
12dd0 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  urn;.}../*.** Fi
12de0 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
12df0 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
12e00 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
12e10 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
12e20 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
12e30 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
12e40 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
12e50 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
12e60 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
12e70 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e  s suppose to con
12e80 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
12e90 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
12ea0 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
12eb0 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
12ec0 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
12ed0 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
12ee0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
12ef0 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
12f00 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
12f10 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
12f20 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
12f30 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
12f40 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
12f50 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
12f60 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
12f70 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
12f80 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
12f90 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
12fa0 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
12fb0 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  iation of the fi
12fc0 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
12fd0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
12fe0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
12ff0 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
13000 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
13010 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
13020 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
13030 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
13040 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
13050 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
13060 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
13070 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
13080 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
13090 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
130a0 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
130b0 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
130c0 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
130d0 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
130e0 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
130f0 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
13100 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
13110 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
13120 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
13130 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
13140 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a  x){.  unsigned *
13150 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  a = pIdx->aiRowE
13160 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  st;.  int i;.  a
13170 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20  ssert( a!=0 );. 
13180 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b   a[0] = 1000000;
13190 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e  .  for(i=pIdx->n
131a0 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31 3b 20 69 2d  Column; i>=1; i-
131b0 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31  -){.    a[i] = 1
131c0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  0;.  }.  if( pId
131d0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
131e0 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64  one ){.    a[pId
131f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b  x->nColumn] = 1;
13200 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
13210 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13220 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
13230 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
13240 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
13250 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
13260 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
13270 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
13280 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
13290 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
132a0 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ist *pName){.  I
132b0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
132c0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
132d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
132e0 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
132f0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
13300 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
13310 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
13320 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13330 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
13340 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
13350 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13360 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
13370 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
13380 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
13390 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
133a0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
133b0 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
133c0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
133d0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
133e0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
133f0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
13400 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13410 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
13420 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
13430 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
13440 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
13450 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13460 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
13470 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
13480 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
13490 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
134a0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
134b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
134c0 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
134d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
134e0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
134f0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
13500 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13510 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  op_index;.  }.#i
13520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13530 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
13540 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
13550 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
13560 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
13570 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
13580 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
13590 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
135a0 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
135b0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
135c0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
135d0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49   SCHEMA_TABLE(pI
135e0 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
135f0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
13600 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
13610 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
13620 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
13630 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13640 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
13650 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
13660 50 44 42 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  PDB && pIndex->i
13670 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
13680 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
13690 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
136a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
136b0 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
136c0 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
136d0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
136e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
136f0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
13700 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
13710 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13720 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
13730 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
13740 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
13750 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13760 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13770 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e   if( v ){.    in
13780 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d 3e  t iDb = pIndex->
13790 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
137a0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
137b0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
137c0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
137d0 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
137e0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
137f0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
13800 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
13810 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
13820 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
13830 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
13840 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
13850 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
13860 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
13870 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
13880 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
13890 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
138a0 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d   iDb, 0, pIndex-
138b0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
138c0 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
138d0 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
138e0 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
138f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
13900 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
13910 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
13920 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
13930 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
13940 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
13950 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
13960 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
13970 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
13980 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
13990 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
139a0 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
139b0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
139c0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
139d0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
139e0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
139f0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
13a00 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
13a10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
13a20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
13a30 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
13a40 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e  st->nId>=pList->
13a50 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74  nAlloc ){.    st
13a60 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
13a70 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   *a;.    pList->
13a80 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e  nAlloc = pList->
13a90 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20  nAlloc*2 + 5;.  
13aa0 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c    a = sqliteReal
13ab0 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  loc(pList->a, pL
13ac0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ist->nAlloc*size
13ad0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
13ae0 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
13af0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13b00 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
13b10 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
13b20 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
13b30 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
13b40 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
13b50 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c  ->a[pList->nId],
13b60 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
13b70 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69 73  ->a[0]));.  pLis
13b80 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
13b90 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
13ba0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
13bb0 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d 3e  oken);.  pList->
13bc0 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  nId++;.  return 
13bd0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
13be0 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
13bf0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13c00 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
13c10 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
13c20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
13c30 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
13c40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
13c50 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
13c60 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
13c70 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
13c80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
13c90 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
13ca0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
13cb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
13cc0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
13cd0 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
13ce0 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
13cf0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
13d00 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
13d10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
13d20 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
13d30 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
13d40 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
13d50 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
13d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
13d70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
13d80 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
13d90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
13da0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
13db0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
13dc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
13dd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
13de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
13df0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
13e00 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
13e10 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
13e20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
13e30 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
13e40 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
13e50 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
13e60 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
13e70 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
13e80 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
13e90 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
13ea0 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
13eb0 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
13ec0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
13ed0 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
13ee0 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
13ef0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
13f00 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
13f10 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
13f20 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
13f30 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
13f40 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
13f50 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
13f60 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
13f70 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
13f80 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
13f90 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
13fa0 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
13fb0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
13fc0 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
13fd0 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
13fe0 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
13ff0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
14000 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
14010 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
14020 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
14030 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
14040 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
14050 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
14060 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
14070 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
14080 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
14090 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
140a0 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
140b0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
140c0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
140d0 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
140e0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
140f0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
14100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
14110 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
14120 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
14130 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
14140 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
14150 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
14160 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
14170 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
14180 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
14190 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
141a0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
141b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
141c0 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
141d0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
141e0 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
141f0 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
14200 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14210 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
14220 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
14230 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
14240 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
14250 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
14260 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14270 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
14280 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
14290 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
142a0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
142b0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
142c0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
142d0 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
142e0 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
142f0 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
14300 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
14310 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
14320 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
14330 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
14340 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
14350 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14360 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14370 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
14380 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
14390 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
143a0 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
143b0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
143c0 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
143d0 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
143e0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
143f0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
14400 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
14410 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
14420 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
14430 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
14440 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
14450 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
14460 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
14470 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
14480 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
14490 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
144a0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
144b0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
144c0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
144d0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
144e0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
144f0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
14500 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
14510 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
14520 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
14530 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
14540 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
14550 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
14560 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
14570 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
14580 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
14590 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
145a0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
145b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
145c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
145d0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74  ;.  for(i=0, pIt
145e0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
145f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
14600 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
14610 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
14620 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
14630 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
14640 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14650 2b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  +;.    if( pItem
14660 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
14670 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14680 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
14690 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
146a0 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
146b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
146c0 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
146d0 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
146e0 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
146f0 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
14700 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14710 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
14720 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
14730 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
14740 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
14750 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
14760 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70  {.    pList->a[p
14770 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41  List->nSrc-1].zA
14780 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
14790 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
147a0 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
147b0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
147c0 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
147d0 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
147e0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
147f0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
14800 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
14810 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
14820 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
14830 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14840 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14850 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
14860 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
14870 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
14880 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
14890 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
148a0 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
148b0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
148c0 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
148d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
148e0 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  (pItem->zAlias);
148f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
14900 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d  teTable(0, pItem
14910 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
14920 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
14930 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
14940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
14950 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
14960 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
14970 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
14980 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
14990 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
149a0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
149b0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
149c0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
149d0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
149e0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
149f0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
14a00 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
14a10 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
14a20 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
14a30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
14a40 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
14a50 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
14a60 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
14a70 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
14a80 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
14a90 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
14aa0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14ab0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14ac0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
14ad0 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
14ae0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
14af0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14b00 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
14b10 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
14b20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
14b30 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
14b40 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
14b50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14b60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14b70 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
14b80 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
14b90 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  IVE)+1);.    }. 
14ba0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
14bb0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
14bc0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
14bd0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
14be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14bf0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
14c00 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
14c10 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14c20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14c30 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
14c40 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
14c50 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
14c60 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
14c70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14c80 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
14c90 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
14ca0 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
14cb0 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
14cc0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14cd0 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
14ce0 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
14cf0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14d00 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14d10 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14d20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
14d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14d40 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
14d50 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
14d60 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
14d70 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14d80 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
14d90 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
14da0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
14db0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
14dc0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
14dd0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
14de0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
14df0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
14e00 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
14e10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
14e20 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
14e30 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
14e40 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
14e50 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14e60 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
14e70 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
14e80 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
14e90 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
14ea0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14eb0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
14ec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ed0 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
14ee0 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
14ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14f00 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
14f10 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
14f20 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
14f30 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
14f40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
14f50 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
14f60 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
14f70 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
14f80 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
14f90 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  ic int sqlite3Op
14fa0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
14fb0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14fc0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14fd0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
14fe0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
14ff0 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
15000 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
15010 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
15020 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
15030 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
15040 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
15050 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15070 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15080 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
15090 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
150a0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
150b0 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
150c0 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
150d0 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
150e0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
150f0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
15100 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
15110 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
15120 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
15130 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15140 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
15150 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
15160 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 1);.      if
15170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15190 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
151a0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
151b0 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
151c0 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
151d0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
151e0 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
151f0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
15200 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
15210 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
15220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15230 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
15240 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
15250 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
15260 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
15270 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
15280 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
15290 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
152a0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
152b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
152c0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
152d0 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
152e0 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
152f0 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
15300 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
15310 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
15320 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
15330 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
15340 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
15350 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
15360 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
15370 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
15380 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
15390 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
153a0 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
153b0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
153c0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
153d0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
153e0 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
153f0 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
15400 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
15410 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
15420 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
15430 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
15440 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
15450 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
15460 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
15470 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
15480 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
15490 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
154a0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
154b0 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
154c0 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
154d0 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
154e0 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
154f0 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
15500 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
15510 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
15520 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
15530 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
15540 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
15550 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
15560 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
15570 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
15580 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
15590 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
155a0 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
155b0 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
155c0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
155d0 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
155e0 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
155f0 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
15600 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
15610 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
15620 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
15630 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
15640 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
15650 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
15660 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
15670 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
15680 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
15690 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
156a0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
156b0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
156c0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
156d0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
156e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
156f0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
15700 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
15710 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15720 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
15730 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
15740 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
15750 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
15760 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
15770 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
15780 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
15790 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
157a0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
157b0 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
157c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
157d0 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
157e0 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
157f0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
15800 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
15810 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
15820 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
15830 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
15840 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20  rt( iDb<32 );.  
15850 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
15860 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
15870 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
15880 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
15890 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
158a0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
158b0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
158c0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
158d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
158e0 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
158f0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
15900 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
15910 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
15920 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
15930 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
15940 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15950 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
15960 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
15970 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
15980 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
15990 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
159a0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
159b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
159c0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
159d0 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
159e0 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
159f0 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
15a00 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
15a10 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
15a20 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
15a30 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
15a40 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
15a50 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
15a60 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
15a70 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
15a80 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
15a90 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
15aa0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
15ab0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
15ac0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
15ad0 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
15ae0 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
15af0 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
15b00 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
15b10 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
15b20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
15b30 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
15b40 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
15b50 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
15b60 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
15b70 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
15b80 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
15b90 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
15ba0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
15bb0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
15bc0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
15bd0 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
15be0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
15bf0 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
15c00 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
15c10 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
15c20 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
15c30 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
15c40 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
15c50 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
15c60 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
15c70 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
15c80 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
15c90 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
15ca0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
15cb0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
15cc0 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
15cd0 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
15ce0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
15cf0 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
15d00 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
15d10 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
15d20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
15d30 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15d40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15d50 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
15d60 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
15d70 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
15d80 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15d90 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
15da0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
15db0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
15dc0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
15dd0 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
15de0 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
15df0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
15e00 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
15e10 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15e20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15e30 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
15e40 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28   0);.  }.  if( (
15e50 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
15e60 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65  Db!=1) && pParse
15e70 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
15e80 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
15e90 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
15ea0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
15eb0 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
15ec0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
15ed0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
15ee0 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
15ef0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
15f00 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
15f10 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
15f20 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
15f30 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
15f40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15f50 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
15f60 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
15f70 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43  atch(CollSeq *pC
15f80 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
15f90 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ex){.  int n = p
15fa0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e  Index->keyInfo.n
15fb0 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71  Field;.  CollSeq
15fc0 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e   **pp = pIndex->
15fd0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20  keyInfo.aColl;. 
15fe0 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20   while( n-- ){. 
15ff0 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c     if( *pp==pCol
16000 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
16010 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65    pp++;.  }.  re
16020 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
16030 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
16040 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
16050 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
16060 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
16070 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
16080 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
16090 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
160a0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
160b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
160c0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
160d0 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
160e0 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
160f0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
16100 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ab, CollSeq *pCo
16110 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
16120 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
16130 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
16140 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
16150 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
16160 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
16170 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
16180 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
16190 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d  {.    if( pColl=
161a0 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
161b0 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65  atch(pColl,pInde
161c0 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x) ){.      sqli
161d0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
161e0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
161f0 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
16200 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
16210 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
16220 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
16230 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
16240 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
16250 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
16260 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
16270 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
16280 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
16290 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
162a0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
162b0 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
162c0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
162d0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
162e0 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
162f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16300 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
16310 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
16320 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
16330 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
16340 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
16370 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
16380 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
16390 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
163a0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
163b0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
163c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
163d0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
163e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
163f0 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
16400 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
16410 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
16420 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
16430 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
16440 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
16450 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
16460 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16470 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
16480 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
16490 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
164a0 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69  +, pDb++){.    i
164b0 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74  f( pDb==0 ) cont
164c0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  inue;.    for(k=
164d0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
164e0 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  &pDb->tblHash); 
164f0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
16500 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
16510 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
16520 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
16530 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
16540 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
16550 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, pColl);.    }
16560 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
16570 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16580 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
16590 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
165a0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165c0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
165d0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
165e0 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
16600 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
16610 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
16620 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
16630 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
16640 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
16650 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
16660 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
16670 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
16680 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
16690 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
166a0 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
166b0 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
166c0 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
166d0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
166e0 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
166f0 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
16700 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
16710 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
16720 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
16730 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
16740 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
16750 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
16760 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
16770 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
16780 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
16790 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
167a0 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
167b0 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
167c0 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
167d0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
167e0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
167f0 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
16800 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
16810 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
16840 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
16850 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
16860 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
16870 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
16880 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
16890 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
168a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
168b0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
168c0 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
168d0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
168e0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
168f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16900 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
16910 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
16920 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
16930 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
16940 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
16950 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16960 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
16970 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16980 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
16990 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
169a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
169b0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
169c0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
169d0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
169e0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
169f0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
16a00 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
16a10 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
16a20 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
16a30 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
16a40 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
16a50 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
16a60 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
16a70 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
16a80 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
16a90 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame1==0 || pName
16aa0 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  1->z==0 ){.    r
16ab0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
16ac0 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
16ad0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
16ae0 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c  if( pName2==0 ||
16af0 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
16b00 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
16b10 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
16b20 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61  db, db->enc, pNa
16b30 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e  me1->z, pName1->
16b40 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  n, 0);.    if( p
16b50 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
16b60 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
16b70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20  Parse, pColl);. 
16b80 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
16b90 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73   }.  }.  iDb = s
16ba0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
16bb0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
16bc0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
16bd0 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
16be0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
16bf0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
16c00 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29  mToken(pObjName)
16c10 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
16c20 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
16c30 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
16c40 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
16c50 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
16c60 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
16c70 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
16c80 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
16c90 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74  Free(z);.    ret
16ca0 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
16cb0 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
16cc0 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
16cd0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
16ce0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
16cf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
16d00 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
16d10 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
16d20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
16d30 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
16d40 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
16d50 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
16d60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16d70 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
16d80 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
16d90 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
16da0 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
16db0 64 69 66 0a                                      dif.