/ Hex Artifact Content
Login

Artifact db063dc322fb18227833c7c41152aac314ef347c:


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 38 20 32 30 30 35 2f 30 39 2f 31 30  1.348 2005/09/10
02f0: 20 31 35 3a 33 35 3a 30 37 20 64 72 68 20 45 78   15:35:07 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
05e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0600: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0610: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0620: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0630: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0650: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0660: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0670: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0680: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0690: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
06a0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
06b0: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
06c0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
06d0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
06e0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
06f0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0700: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0710: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
0720: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
0730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0740: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
0750: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
0760: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
0770: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0780: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0790: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
07a0: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
07b0: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
07c0: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
07d0: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
07e0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
07f0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
0800: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0810: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
0820: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
0830: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
0840: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
0850: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
0860: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
0870: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0880: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0890: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
08a0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
08b0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
08c0: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
08d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
08e0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
08f0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0900: 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  to-1, sqlite3Vdb
0910: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
0920: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
0930: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
0940: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
0950: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
0960: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
0970: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
0980: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
0990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
09a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
09b0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
09c0: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
09d0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
09e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
09f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0a00: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
0a10: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
0a20: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
0a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
0a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0a50: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
0a60: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
0a70: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
0a80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
0a90: 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20  CE.    /* Add a 
0aa0: 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61  No-op that conta
0ab0: 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ins the complete
0ac0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d   text of the com
0ad0: 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a  piled SQL.    **
0ae0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
0af0: 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20  s P3 argument.  
0b00: 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68  This does not ch
0b10: 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f  ange the functio
0b20: 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66  nality.    ** of
0b30: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20   the program. . 
0b40: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
0b50: 73 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  s is used to imp
0b60: 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74  lement sqlite3_t
0b70: 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  race()..    */. 
0b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
0b90: 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  3(v, OP_Noop, 0,
0ba0: 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c   0, pParse->zSql
0bb0: 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d  , pParse->zTail-
0bc0: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 23  pParse->zSql);.#
0bd0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0be0: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20  OMIT_TRACE */.  
0bf0: 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  }...  /* Get the
0c00: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
0c10: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
0c20: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
0c30: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
0c40: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
0c50: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
0c60: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
0c70: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
0c80: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
0c90: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0ca0: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0cb0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0cc0: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0cd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c   pParse->nMem+3,
0ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0cf0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
0d00: 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65  ->nTab+3, pParse
0d10: 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  ->explain);.    
0d20: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
0d30: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50  ITE_DONE;.    pP
0d40: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
0d50: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
0d60: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
0d70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0d80: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
0d90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
0da0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
0db0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
0dc0: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
0dd0: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
0de0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
0df0: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
0e00: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  ask = 0;.  pPars
0e10: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
0e20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
0e30: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63  the parser and c
0e40: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65  ode generator re
0e50: 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64  cursively in ord
0e60: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a  er to generate.*
0e70: 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  * code for the S
0e80: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  QL statement giv
0e90: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  en onto the end 
0ea0: 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f  of the pParse co
0eb0: 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74  ntext.** current
0ec0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
0ed0: 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65  ction.  When the
0ee0: 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72   parser is run r
0ef0: 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68  ecursively.** th
0f00: 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61  is way, the fina
0f10: 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74  l OP_Halt is not
0f20: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74   appended and ot
0f30: 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  her initializati
0f40: 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69  on.** and finali
0f50: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65  zation steps are
0f60: 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65   omitted because
0f70: 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c   those are handl
0f80: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75  ing by the.** ou
0f90: 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a  termost parser..
0fa0: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74  **.** Not everyt
0fb0: 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65  hing is nestable
0fc0: 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79  .  This facility
0fd0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
0fe0: 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54  permit.** INSERT
0ff0: 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45  , UPDATE, and DE
1000: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
1010: 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d  against SQLITE_M
1020: 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63  ASTER.  Use.** c
1030: 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64  are if you decid
1040: 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20  e to try to use 
1050: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72  this routine for
1060: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1070: 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oses..*/.void sq
1080: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1090: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
10b0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
10c0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
10d0: 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20  *zSql;.# define 
10e0: 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66  SAVE_SZ  (sizeof
10f0: 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74  (Parse) - offset
1100: 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a  of(Parse,nVar)).
1110: 20 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53    char saveBuf[S
1120: 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20  AVE_SZ];..  if( 
1130: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
1140: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
1150: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c   pParse->nested<
1160: 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e  10 );  /* Nestin
1170: 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  g should only be
1180: 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74   of limited dept
1190: 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28  h */.  va_start(
11a0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
11b0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d  zSql = sqlite3VM
11c0: 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  Printf(zFormat, 
11d0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
11e0: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
11f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1200: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1210: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1220: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1230: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1240: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1250: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1260: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1270: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1280: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1290: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
12a0: 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  rse, zSql, 0);. 
12b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c   sqliteFree(zSql
12c0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
12d0: 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42  rse->nVar, saveB
12e0: 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  uf, SAVE_SZ);.  
12f0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d  pParse->nested--
1300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
1310: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1320: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1330: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
1340: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
1350: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
1360: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
1370: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
1380: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
1390: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
13a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
13b0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
13c0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
13d0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
13e0: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
13f0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
1400: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74  arched for the t
1410: 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  able and the.** 
1420: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74  first matching t
1430: 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  able is returned
1440: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .  (No checking 
1450: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61  for duplicate ta
1460: 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20  ble.** names is 
1470: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
1480: 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50  ch order is TEMP
1490: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
14a0: 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61  N, then any.** a
14b0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
14c0: 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74  es added using t
14d0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
14e0: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
14f0: 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  o sqlite3LocateT
1500: 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65  able()..*/.Table
1510: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62   *sqlite3FindTab
1520: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
1530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1540: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1550: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62  Database){.  Tab
1560: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  le *p = 0;.  int
1570: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e   i;.  assert( zN
1580: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ame!=0 );.  asse
1590: 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  rt( (db->flags &
15a0: 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69   SQLITE_Initiali
15b0: 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  zed) || db->init
15c0: 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69  .busy );.  for(i
15d0: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
15e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
15f0: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
1600: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
1610: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
1620: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
1630: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
1640: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1650: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
1660: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
1670: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1680: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
1690: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
16a0: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
16b0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
16c0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
16d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
16e0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
16f0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1700: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1710: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1720: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1730: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1740: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1750: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1760: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1770: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1780: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1790: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
17a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
17b0: 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76  ound.  Also leav
17c0: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  e an.** error me
17d0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
17e0: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
17f0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1800: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
1810: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
1820: 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68  indTable() is th
1830: 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  at this.** routi
1840: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
1850: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
1860: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68  arse->zErrMsg wh
1870: 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69  ere.** sqlite3Fi
1880: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1890: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
18a0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
18b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
18d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
18e0: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
18f0: 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  *p;..  /* Read t
1900: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1910: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
1920: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
1930: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1940: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
1950: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
1960: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
1970: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1980: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1990: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
19a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20  urn 0;.  }..  p 
19b0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
19c0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
19d0: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
19e0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
19f0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
1a00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1a20: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e   such table: %s.
1a30: 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  %s", zDbase, zNa
1a40: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
1a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1a60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1a70: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1a80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
1a90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
1aa0: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1ab0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1ac0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1ad0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1ae0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1af0: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
1b00: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
1b10: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1b20: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
1b30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1b40: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
1b50: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
1b60: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
1b70: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1b80: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
1b90: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
1ba0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
1bb0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
1bc0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
1bd0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
1be0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
1bf0: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
1c00: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
1c10: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
1c20: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
1c30: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
1c40: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
1c50: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
1c60: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
1c70: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
1c80: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
1c90: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
1ca0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
1cb0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1cc0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
1cd0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
1ce0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
1cf0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1d00: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
1d10: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
1d20: 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  d) || db->init.b
1d30: 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  usy );.  for(i=O
1d40: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
1d50: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1d60: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
1d70: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
1d80: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
1d90: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
1da0: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
1db0: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
1dc0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
1dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
1de0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1df0: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64  d(&db->aDb[j].id
1e00: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
1e10: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1e20: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1e30: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1e40: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
1e50: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
1e60: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
1e70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e80: 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  reeIndex(Index *
1e90: 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p){.  sqliteFree
1ea0: 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  (p->zColAff);.  
1eb0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
1ec0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
1ed0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
1ee0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
1ef0: 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72  sh table, and fr
1f00: 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79  ee.** its memory
1f10: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a   structures..**.
1f20: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  ** The index is 
1f30: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1f40: 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74   database hash t
1f50: 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20  ables but.** it 
1f60: 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20  is not unlinked 
1f70: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74  from the Table t
1f80: 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a  hat it indexes..
1f90: 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f  ** Unlinking fro
1fa0: 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74  m the Table must
1fb0: 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20   be done by the 
1fc0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fe0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
1ff0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2000: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64  Index *p){.  Ind
2010: 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73  ex *pOld;..  ass
2020: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
2030: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
2040: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
2050: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
2060: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
2070: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e        strlen(p->
20a0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
20b0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
20c0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
20d0: 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a  freeIndex(p);.}.
20e0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
20f0: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
2100: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
2110: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
2120: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
2130: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
2140: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
2150: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
2160: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
2170: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
2180: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
2190: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
21a0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
21b0: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
21c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
21d0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
21e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
21f0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
2200: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
2210: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
2220: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c 65 6e   int len;..  len
2230: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61   = strlen(zIdxNa
2240: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  me);.  pIndex = 
2250: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2260: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
2270: 69 64 78 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  idxHash, zIdxNam
2280: 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20  e, len+1, 0);.  
2290: 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
22a0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
22b0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
22c0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
22d0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
22e0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
22f0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
2300: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
2310: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e  .      for(p=pIn
2320: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2330: 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65  dex; p && p->pNe
2340: 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d  xt!=pIndex; p=p-
2350: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  >pNext){}.      
2360: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  if( p && p->pNex
2370: 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  t==pIndex ){.   
2380: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
2390: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
23a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23b0: 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
23c0: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  x);.  }.  db->fl
23d0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
23e0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
23f0: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2400: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
2410: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d  on from the in-m
2420: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
2430: 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  s of.** a single
2440: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
2450: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2460: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
2470: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
2480: 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73  he database clos
2490: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
24a0: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
24b0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
24c0: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
24d0: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
24e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
24f0: 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d  or if a.** schem
2500: 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63  a-cookie mismatc
2510: 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  h occurs..**.** 
2520: 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72  If iDb<=0 then r
2530: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2540: 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  l schema tables 
2550: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
2560: 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69  .** files.  If i
2570: 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74  Db>=2 then reset
2580: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
2590: 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68  hema for only th
25a0: 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65  e.** single file
25b0: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76   indicated..*/.v
25c0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
25d0: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73  InternalSchema(s
25e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
25f0: 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iDb){.  HashElem
2600: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
2610: 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65  temp1;.  Hash te
2620: 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  mp2;.  int i, j;
2630: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
2640: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
2650: 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  b );.  db->flags
2660: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74   &= ~SQLITE_Init
2670: 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69  ialized;.  for(i
2680: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
2690: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
26a0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
26b0: 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44  ;.    temp1 = pD
26c0: 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20  b->tblHash;.    
26d0: 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69  temp2 = pDb->tri
26e0: 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74  gHash;.    sqlit
26f0: 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d  e3HashInit(&pDb-
2700: 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54  >trigHash, SQLIT
2710: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
2730: 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46  shClear(&pDb->aF
2740: 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
2750: 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d  3HashClear(&pDb-
2760: 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66  >idxHash);.    f
2770: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2780: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29  ashFirst(&temp2)
2790: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
27a0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
27b0: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 73 71 6c  lem)){.      sql
27c0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
27d0: 72 28 28 54 72 69 67 67 65 72 2a 29 73 71 6c 69  r((Trigger*)sqli
27e0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
27f0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
2800: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2810: 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69  temp2);.    sqli
2820: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
2830: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
2840: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2850: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
2860: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2870: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
2880: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2890: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
28a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
28b0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
28c0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
28d0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
28e0: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
28f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2900: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29  ashClear(&temp1)
2910: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 53 65 71 54  ;.    pDb->pSeqT
2920: 61 62 20 3d 20 30 3b 0a 20 20 20 20 44 62 43 6c  ab = 0;.    DbCl
2930: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
2940: 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  i, DB_SchemaLoad
2950: 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  ed);.    if( iDb
2960: 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  >0 ) return;.  }
2970: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
2980: 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  0 );.  db->flags
2990: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
29a0: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a  rnChanges;..  /*
29b0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
29c0: 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  of the auxiliary
29d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
29e0: 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  has been closed,
29f0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  .  ** then remov
2a00: 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20  e then from the 
2a10: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2a20: 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b  se list.  We tak
2a30: 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72  e the.  ** oppor
2a40: 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69  tunity to do thi
2a50: 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20  s here since we 
2a60: 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65  have just delete
2a70: 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a  d all of the.  *
2a80: 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61  * schema hash ta
2a90: 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f  bles and therefo
2aa0: 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  re do not have t
2ab0: 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  o make any chang
2ac0: 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f  es.  ** to any o
2ad0: 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  f those tables..
2ae0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2af0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2b00: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
2b10: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
2b20: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
2b30: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
2b40: 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26  if( pDb->pAux &&
2b50: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29   pDb->xFreeAux )
2b60: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70   pDb->xFreeAux(p
2b70: 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  Db->pAux);.     
2b80: 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a   pDb->pAux = 0;.
2b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
2ba0: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
2bb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2bc0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2bd0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2be0: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
2c00: 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  e(pDb->zName);. 
2c10: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
2c20: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
2c30: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
2c40: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
2c50: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
2c60: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
2c70: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
2c80: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
2c90: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
2ca0: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
2cb0: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
2cc0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
2cd0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
2ce0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
2cf0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
2d00: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
2d10: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
2d20: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
2d30: 20 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e   sqliteFree(db->
2d40: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
2d50: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
2d60: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
2d70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2d80: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
2d90: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
2da0: 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  s.  If there wer
2db0: 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e  e.** schema chan
2dc0: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
2dd0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
2de0: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65   we have to rese
2df0: 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61  t the.** interna
2e00: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  l hash tables an
2e10: 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72  d reload them fr
2e20: 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64  om disk..*/.void
2e30: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
2e40: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2e50: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2e60: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
2e70: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2e80: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
2e90: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2ea0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
2eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2ec0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2ed0: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
2ee0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
2ef0: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
2f00: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2f10: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
2f20: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2f30: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
2f50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
2f60: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f  s from a table o
2f70: 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69  r view..*/.stati
2f80: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73  c void sqliteRes
2f90: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
2fa0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
2fb0: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
2fc0: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
2fd0: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
2fe0: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
2ff0: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
3000: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3010: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
3020: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
3030: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
3040: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3050: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3060: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
3070: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3080: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
3090: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
30a0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
30b0: 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  );.  }.  pTable-
30c0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
30d0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d  ble->nCol = 0;.}
30e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
30f0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
3100: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3110: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
3120: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
3130: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
3140: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
3150: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
3160: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
3170: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
3180: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
3190: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
31a0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
31b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
31c0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
31d0: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
31e0: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
31f0: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
3200: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
3210: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
3220: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
3230: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
3240: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
3250: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
3260: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
3270: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
3280: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
3290: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
32a0: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
32b0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
32c0: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
32d0: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
32e0: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
32f0: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
3300: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
3310: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
3320: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
3330: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
3340: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
3350: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
3360: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3370: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
3380: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3390: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
33a0: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
33b0: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
33c0: 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  ey;..  if( pTabl
33d0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  e==0 ) return;..
33e0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65    /* Do not dele
33f0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74  te the table unt
3400: 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  il the reference
3410: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
3420: 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65  ero. */.  pTable
3430: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
3440: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29  pTable->nRef>0 )
3450: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
3460: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
3470: 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
3480: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
3490: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
34a0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
34b0: 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  le.  */.  for(pI
34c0: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
34d0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
34e0: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
34f0: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
3500: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
3510: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62  ert( pIndex->iDb
3520: 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c  ==pTable->iDb ||
3530: 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30   (pTable->iDb==0
3540: 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d   && pIndex->iDb=
3550: 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  =1) );.    sqlit
3560: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  eDeleteIndex(db,
3570: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23   pIndex);.  }..#
3580: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3590: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
35a0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66   /* Delete all f
35b0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
35c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
35d0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79   table.  The key
35e0: 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  s.  ** should ha
35f0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
3600: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
3610: 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68  e db->aFKey hash
3620: 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66   table .  */.  f
3630: 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d  or(pFKey=pTable-
3640: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
3650: 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b  FKey=pNextFKey){
3660: 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d  .    pNextFKey =
3670: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
3680: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
3690: 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e  Table->iDb<db->n
36a0: 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
36b0: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
36c0: 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c  d(&db->aDb[pTabl
36d0: 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20  e->iDb].aFKey,. 
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
3700: 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b  >zTo, strlen(pFK
3710: 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b  ey->zTo)+1)!=pFK
3720: 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
3730: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d  Free(pFKey);.  }
3740: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
3750: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
3760: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
3770: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65  .  */.  sqliteRe
3780: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
3790: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
37a0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
37b0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
37c0: 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  e(pTable->zColAf
37d0: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
37e0: 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  ectDelete(pTable
37f0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
3800: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
3810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
3820: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
3830: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3840: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
3850: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
3860: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
3870: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
3880: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
3890: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
38a0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
38b0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
38c0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
38d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
38e0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
38f0: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
3900: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
3910: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3920: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
3930: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
3940: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
3950: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
3960: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
3970: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3980: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
3990: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
39a0: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
39b0: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61  e, strlen(zTabNa
39c0: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
39d0: 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   p ){.#ifndef SQ
39e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
39f0: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
3a00: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
3a10: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
3a20: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
3a30: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
3a40: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
3a50: 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48    pF2 = sqlite3H
3a60: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46  ashFind(&pDb->aF
3a70: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
3a80: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
3a90: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
3aa0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
3ab0: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
3ac0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
3ad0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
3ae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3af0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
3b00: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
3b10: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
3b20: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
3b30: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
3b40: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
3b50: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
3b60: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
3b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
3b80: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
3b90: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
3ba0: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
3bb0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3bc0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3bd0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
3be0: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
3bf0: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
3c00: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
3c10: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
3c20: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
3c30: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
3c40: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
3c50: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3c60: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
3c70: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
3c80: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
3c90: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
3ca0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
3cb0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
3cc0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
3cd0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
3ce0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
3cf0: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
3d00: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
3d10: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
3d20: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
3d30: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3d40: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
3d50: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
3d60: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
3d70: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
3d80: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
3d90: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
3da0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
3db0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
3dc0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
3dd0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
3df0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
3e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
3e10: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
3e20: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
3e30: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
3e40: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3e50: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
3e60: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
3e70: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
3e80: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
3e90: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
3ea0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3eb0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
3ec0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44  (Vdbe *v, int iD
3ed0: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
3ee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3ef0: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
3f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f10: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3f20: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
3f30: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
3f40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
3f50: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
3f60: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
3f70: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
3f80: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  s */.}../*.** Th
3f90: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
3fa0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
3fb0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
3fc0: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
3fd0: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
3fe0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
3ff0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
4000: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
4010: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
4020: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
4030: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
4040: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
4050: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
4060: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
4070: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
4080: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
4090: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
40a0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20  t i = -1;    /* 
40b0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
40c0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
40d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40e0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
40f0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20  he name */.  Db 
4100: 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41  *pDb;       /* A
4110: 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20   database whose 
4120: 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65  name space is be
4130: 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a  ing searched */.
4140: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
4150: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
4160: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
4170: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ..  zName = sqli
4180: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4190: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
41a0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20  Name ){.    n = 
41b0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
41c0: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
41d0: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
41e0: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
41f0: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
4200: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
4210: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
4220: 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e  ==strlen(pDb->zN
4230: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4240: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4250: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4260: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4280: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4290: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
42a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
42b0: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
42c0: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
42d0: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
42e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
42f0: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
4300: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
4310: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
4320: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
4330: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
4340: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
4350: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
4360: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
4370: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4380: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
4390: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
43a0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
43b0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
43c0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
43d0: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
43e0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
43f0: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
4400: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
4410: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
4420: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
4430: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
4440: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
4450: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
4460: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
4470: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
4480: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
4490: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
44a0: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
44b0: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
44c0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
44d0: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
44e0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
44f0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
4500: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4510: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4520: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4530: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
4540: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4550: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
4560: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
4570: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
4580: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
4590: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
45a0: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
45b0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
45c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
45d0: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
45e0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
45f0: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
4600: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
4610: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
4620: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4630: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
4640: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
4650: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4660: 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65  db;..  if( pName
4670: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  2 && pName2->n>0
4680: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4690: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
46a0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
46b0: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
46c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
46d0: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
46e0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
46f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4700: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
4710: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
4720: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
4730: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4740: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
4750: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
4760: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
4770: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
4780: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
4790: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
47a0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
47b0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
47c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
47d0: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
47e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
47f0: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
4800: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
4810: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
4820: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
4830: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
4840: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
4850: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
4860: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
4870: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
4880: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
4890: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
48a0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
48b0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
48c0: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
48d0: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
48e0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
48f0: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
4900: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4910: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
4920: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
4930: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
4940: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
4950: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
4960: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
4970: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
4980: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
4990: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
49a0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
49b0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
49c0: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
49d0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
49e0: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
49f0: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
4a00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4a10: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
4a20: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
4a30: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
4a40: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
4a50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4a60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
4a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
4a90: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
4aa0: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
4ab0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
4ac0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
4ad0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
4ae0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
4af0: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
4b00: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
4b10: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
4b20: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4b30: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
4b40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4b50: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
4b60: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
4b70: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
4b80: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
4b90: 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53  name.  The.** pS
4ba0: 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  tart token is th
4bb0: 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61  e CREATE and pNa
4bc0: 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  me is the table 
4bd0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d  name.  The isTem
4be0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
4bf0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
4c00: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
4c10: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
4c20: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
4c30: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
4c40: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4c50: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
4c60: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
4c70: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
4c80: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
4c90: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
4ca0: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
4cb0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
4cc0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
4cd0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
4ce0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
4cf0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
4d00: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
4d10: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
4d20: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4d30: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
4d40: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
4d50: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
4d60: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
4d70: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
4d80: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
4d90: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
4da0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
4db0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4dc0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
4dd0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
4de0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
4df0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
4e00: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
4e10: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
4e20: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4e30: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
4e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4e50: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4e60: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4e70: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
4e80: 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a  "CREATE" token *
4e90: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4ea0: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
4eb0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
4ec0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
4ed0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
4ee0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
4ef0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
4f00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
4f10: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
4f20: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
4f30: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
4f40: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
4f50: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20  */.  int isView 
4f60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4f70: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
4f80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
4f90: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
4fa0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
4fb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
4fc0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
4fd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4fe0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
4ff0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5000: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5010: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
5020: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
5030: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
5040: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
5050: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
5060: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
5070: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
5080: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
5090: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
50a0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
50b0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
50c0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
50d0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
50e0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
50f0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5100: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
5110: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5120: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5130: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
5140: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5150: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
5160: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
5170: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
5180: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5190: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
51a0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
51b0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
51c0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
51d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
51e0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
51f0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5200: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
5210: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
5220: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
5230: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
5240: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
5250: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
5260: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5270: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5280: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
5290: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
52a0: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
52b0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
52c0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
52d0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
52e0: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
52f0: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
5300: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
5310: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
5320: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
5330: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
5340: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
5350: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
5360: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
5370: 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a   iDb>1 ){.    /*
5380: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
5390: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
53a0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
53b0: 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  ualified */.    
53c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
53d0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
53e0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
53f0: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
5400: 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d");.    return;
5410: 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54  .  }.  if( !OMIT
5420: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5430: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
5440: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
5450: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
5460: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5470: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
5480: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
5490: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
54a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
54b0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
54c0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
54d0: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
54e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
54f0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  r;.  }.  if( db-
5500: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69  >init.iDb==1 ) i
5510: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64  sTemp = 1;.#ifnd
5520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5530: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61  UTHORIZATION.  a
5540: 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26  ssert( (isTemp &
5550: 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20   1)==isTemp );. 
5560: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
5570: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
5580: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
5590: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
55a0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
55b0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
55c0: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
55d0: 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
55e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
55f0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5600: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
5610: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
5620: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5630: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
5640: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5650: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5660: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
5670: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
5680: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5690: 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  E_VIEW;.      }.
56a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56b0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
56c0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
56d0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
56e0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
56f0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
5700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
5710: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5720: 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  E_TABLE;.      }
5730: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
5740: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
5750: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
5760: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
5770: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
5780: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5790: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
57a0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
57b0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
57c0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
57d0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
57e0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
57f0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
5800: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
5810: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
5820: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
5830: 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f  ** it does..  */
5840: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
5850: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
5860: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
5870: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5880: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5890: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
58a0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
58b0: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
58c0: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b].zName);.  if(
58d0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73   pTable ){.    s
58e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
58f0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
5900: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
5910: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  , pName);.    go
5920: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5930: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5940: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
5950: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
5960: 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20  0 && (iDb==0 || 
5970: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
5980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5990: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
59a0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
59b0: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
59c0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
59d0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
59e0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
59f0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61  Table = sqliteMa
5a00: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
5a10: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
5a20: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ble==0 ){.    pP
5a30: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
5a40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
5a50: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5a60: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5a70: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
5a80: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
5a90: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
5aa0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
5ab0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
5ac0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
5ad0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
5ae0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
5af0: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
5b00: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
5b10: 31 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  1;.  if( pParse-
5b20: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
5b30: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
5b40: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
5b50: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
5b60: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
5b70: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
5b80: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
5b90: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
5ba0: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
5bb0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
5bc0: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
5bd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
5be0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
5bf0: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
5c00: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
5c10: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
5c20: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
5c30: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
5c40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5c50: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
5c60: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
5c70: 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d  d && strcmp(zNam
5c80: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
5c90: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
5ca0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65  db->aDb[iDb].pSe
5cb0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
5cc0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5cd0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
5ce0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
5cf0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
5d00: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
5d10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
5d20: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
5d30: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
5d40: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
5d50: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
5d60: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
5d70: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
5d80: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
5d90: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
5da0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
5db0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
5dc0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
5dd0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
5de0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
5df0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
5e00: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
5e10: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
5e20: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
5e30: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
5e40: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
5e50: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5e60: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
5e70: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
5e80: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
5e90: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
5ea0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
5eb0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
5ec0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c  0 ){.    int lbl
5ed0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
5ee0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
5ef0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
5f00: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
5f10: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
5f20: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
5f30: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
5f40: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
5f50: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
5f60: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  w..    */.    sq
5f70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5f80: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
5f90: 20 69 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66   iDb, 1);   /* f
5fa0: 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile_format */.  
5fb0: 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56    lbl = sqlite3V
5fc0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5fe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
5ff0: 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c  0, lbl);.    sql
6000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6010: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6020: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
6030: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6040: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
6050: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
6060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6070: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6080: 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29  ger, db->enc, 0)
6090: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
60a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
60b0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b  Cookie, iDb, 4);
60c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60d0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
60e0: 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  lbl);..    /* Th
60f0: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
6100: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
6110: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
6120: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
6130: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
6140: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
6150: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
6160: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
6170: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
6180: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
6190: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
61a0: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
61b0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
61c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
61d0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
61e0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
61f0: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
6200: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6210: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c  ** The rowid val
6220: 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  ue is needed by 
6230: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  the code that sq
6240: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
6250: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
6260: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  te..    */.#ifnd
6270: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6280: 49 45 57 0a 20 20 20 20 69 66 28 20 69 73 56 69  IEW.    if( isVi
6290: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
62a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
62b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
62c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
62d0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
62e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62f0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6300: 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  le, iDb, 0);.   
6310: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
6320: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
6330: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
6340: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6350: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 30  P_NewRowid, 0, 0
6360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6370: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
6380: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
6390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
63a0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
63b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
63d0: 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ert, 0, 0);.    
63e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
63f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6400: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6410: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6420: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Pull, 1, 0);.  }
6430: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
6440: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
6450: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
6460: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
6470: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
6480: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
6490: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
64a0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
64b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
64c0: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
64d0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
64e0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
64f0: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
6500: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
6510: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
6520: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
6530: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
6540: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
6550: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
6560: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
6570: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
6580: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
6590: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
65a0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
65b0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
65c0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
65d0: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
65e0: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
65f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
6600: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
6610: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
6620: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
6630: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
6640: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
6650: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
6660: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
6670: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6680: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
6690: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
66a0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
66b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
66c0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
66d0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
66e0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
66f0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
6700: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
6710: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
6720: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6730: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
6740: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
6750: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
6760: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
6770: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
6780: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6790: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
67a0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
67b0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
67c0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
67d0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
67e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
67f0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
6800: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6810: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6820: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6830: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
6840: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6850: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
6860: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6870: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
6880: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
6890: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
68a0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
68b0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
68c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
68d0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
68e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
68f0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
6900: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
6910: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6920: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
6930: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
6940: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
6950: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
6960: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
6970: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
6980: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
6990: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
69a0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
69b0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
69c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
69d0: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
69e0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
69f0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
6a00: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
6a10: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
6a20: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6a30: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
6a40: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
6a50: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
6a60: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
6a70: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
6a80: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
6a90: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
6aa0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
6ab0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
6ac0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
6ad0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
6ae0: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
6af0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
6b00: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
6b10: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6b20: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
6b30: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
6b40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
6b50: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
6b60: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
6b70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6b80: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
6b90: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
6ba0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
6bb0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
6bc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6bd0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
6be0: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
6bf0: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
6c00: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
6c10: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6c20: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6c30: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6c40: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6c50: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6c60: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
6c70: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
6c80: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
6c90: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6ca0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
6cb0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6cc0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6cd0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6ce0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
6cf0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
6d00: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
6d10: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
6d20: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
6d30: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
6d40: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
6d50: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
6d60: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
6d70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6d80: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
6d90: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
6da0: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
6db0: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
6dc0: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
6dd0: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
6de0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
6df0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
6e00: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
6e10: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
6e20: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
6e30: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
6e40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
6e50: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
6e60: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
6e70: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
6e80: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
6e90: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
6ea0: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
6eb0: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
6ec0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
6ed0: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
6ee0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
6ef0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
6f00: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
6f30: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
6f40: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
6f50: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
6f60: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
6f70: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
6f80: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
6f90: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
6fa0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
6fb0: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
6fc0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
6fd0: 4f 4e 45 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  ONE.**.** If non
6fe0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
6ff0: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
7000: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
7010: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
7020: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
7030: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
7040: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
7050: 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54  (const Token *pT
7060: 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  ype){.  u32 h = 
7070: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
7080: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7090: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  IC;.  const unsi
70a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d  gned char *zIn =
70b0: 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e   pType->z;.  con
70c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
70d0: 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70 65 2d   *zEnd = &pType-
70e0: 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20  >z[pType->n];.. 
70f0: 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e   while( zIn!=zEn
7100: 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  d ){.    h = (h<
7110: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
7120: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b  erToLower[*zIn];
7130: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
7140: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7150: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
7160: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
7170: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
7180: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7190: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
71a0: 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20   .    }else if( 
71b0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
71c0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
71d0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
71e0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
71f0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7200: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7210: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
7220: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
7230: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
7240: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
7250: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7260: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
7270: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7280: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
7290: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
72a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
72b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
72c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
72d0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
72e0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
72f0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65  _NONE;.    }else
7300: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7310: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7320: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7330: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7340: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7350: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 20 0a 20  _AFF_INTEGER; . 
7360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7370: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
7380: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
7390: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
73a0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
73b0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
73c0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
73d0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
73e0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
73f0: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
7400: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
7410: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
7420: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
7430: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
7440: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
7450: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
7460: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
7470: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
7480: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
7490: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
74a0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
74b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
74c0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
74d0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
74e0: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
74f0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
7500: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
7510: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
7520: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
7530: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
7540: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
7550: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
7560: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7570: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
7580: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
7590: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
75a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
75b0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
75c0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
75d0: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
75e0: 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65  Col[i];.  sqlite
75f0: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
7600: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
7610: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7620: 6f 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a  omToken(pType);.
7630: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
7640: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
7650: 74 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d  tyType(pType);.}
7660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
7670: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
7680: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
7690: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
76a0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
76b0: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
76c0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
76d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
76e0: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
76f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
7700: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
7710: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
7720: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
7730: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
7740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7750: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
7760: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
7770: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
7780: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
7790: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
77a0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
77b0: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
77c0: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
77d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
77e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
77f0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
7800: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7810: 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29  >pNewTable)!=0 )
7820: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
7830: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
7840: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
7850: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
7860: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78  ntOrFunction(pEx
7870: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
7880: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7890: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
78a0: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
78b0: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
78c0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
78d0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
78e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
78f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7900: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
7910: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
7920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7930: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  (pExpr);.    }. 
7940: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
7950: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d  Delete(pExpr);.}
7960: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
7970: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
7980: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
7990: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
79a0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
79b0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
79c0: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
79d0: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
79e0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
79f0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
7a00: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
7a10: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
7a20: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
7a30: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
7a40: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
7a50: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
7a60: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
7a70: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
7a80: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
7a90: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
7aa0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
7ab0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
7ac0: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
7ad0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
7ae0: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
7af0: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
7b00: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
7b10: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
7b20: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
7b30: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
7b40: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
7b50: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
7b60: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
7b70: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
7b80: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
7b90: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
7ba0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7bb0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
7bc0: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
7bd0: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
7be0: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
7bf0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
7c00: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
7c10: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
7c20: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
7c30: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
7c40: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
7c50: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
7c60: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
7c70: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
7c80: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
7c90: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
7ca0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
7cb0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
7cc0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
7cd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7ce0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
7cf0: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
7d00: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
7d10: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
7d20: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
7d30: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
7d40: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
7d50: 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20 2f   autoInc       /
7d60: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
7d70: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
7d80: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
7d90: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
7da0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
7db0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
7dc0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
7dd0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
7de0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
7df0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
7e00: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
7e10: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
7e20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7e30: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
7e40: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
7e50: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
7e60: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
7e70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
7e80: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
7e90: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
7ea0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
7eb0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
7ec0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
7ed0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
7ee0: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
7ef0: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
7f00: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
7f10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7f20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7f30: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
7f40: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
7f50: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
7f60: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7f70: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
7f80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
7f90: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
7fa0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
7fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7fd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
7fe0: 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e  b->nCol ) pTab->
7ff0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
8000: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  mKey = 1;.    }.
8010: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
8020: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
8030: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
8040: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8050: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
8060: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
8070: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
8080: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
8090: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
80a0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
80b0: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
80c0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
80d0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
80e0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
80f0: 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63     pTab->autoInc
8100: 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65   = autoInc;.  }e
8110: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
8120: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
8130: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
8140: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
8150: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8160: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
8170: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
8180: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
8190: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
81a0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
81b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
81c0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
81d0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
81e0: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
81f0: 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , 0);.    pList 
8200: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
8210: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
8220: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8230: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
8240: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  turn;.}../*.** S
8250: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
8260: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
8270: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
8280: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
8290: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
82a0: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
82b0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
82c0: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
82d0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
82e0: 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20  har *zType, int 
82f0: 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  nType){.  Table 
8300: 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  *p;.  Index *pId
8310: 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  x;.  CollSeq *pC
8320: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  oll;.  int i;.. 
8330: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
8340: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
8350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
8360: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43  p->nCol-1;..  pC
8370: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
8380: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
8390: 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29  e, zType, nType)
83a0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70  ;.  p->aCol[i].p
83b0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20  Coll = pColl;.. 
83c0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
83d0: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
83e0: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
83f0: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
8400: 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  pe>",.  ** then 
8410: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
8420: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
8430: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
8440: 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f  fore the.  ** co
8450: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
8460: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
8470: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
8480: 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  e case..  */.  f
8490: 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49 6e  or(pIdx = p->pIn
84a0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
84b0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
84c0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
84d0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
84e0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
84f0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49 64  lumn[0]==i ) pId
8500: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
8510: 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d  [0] = pColl;.  }
8520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
8530: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
8540: 65 71 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  eq() for all col
8550: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
8560: 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   in an index,.**
8570: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72   in order to ver
8580: 69 66 79 20 74 68 61 74 20 61 6c 6c 20 74 68 65  ify that all the
8590: 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6c 6c 61   necessary colla
85a0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
85b0: 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f  re.** loaded..*/
85c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
85d0: 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50 61  kIndexCollSeq(Pa
85e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
85f0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28  ex *pIdx){.  if(
8600: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74   pIdx ){.    int
8610: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
8620: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
8630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
8640: 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  ( sqlite3CheckCo
8650: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
8660: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
8670: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[i]) ){.       
8680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8690: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
86a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
86b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
86c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
86d0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
86e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
86f0: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
8700: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
8710: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
8720: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
8730: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
8740: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
8750: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
8760: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
8770: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
8780: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
8790: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
87a0: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
87b0: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
87c0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
87d0: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
87e0: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
87f0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
8800: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
8810: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
8820: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
8830: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
8840: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
8850: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
8860: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
8870: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
8880: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
8890: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
88a0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
88b0: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
88c0: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
88d0: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
88e0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
88f0: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
8900: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
8910: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
8920: 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  e..*/.CollSeq *s
8930: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
8940: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
8950: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
8960: 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29  Name, int nName)
8970: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
8980: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8990: 75 38 20 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63  u8 enc = db->enc
89a0: 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20  ;.  u8 initbusy 
89b0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  = db->init.busy;
89c0: 0a 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ..  CollSeq *pCo
89d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
89e0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
89f0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
8a00: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
8a10: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
8a20: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
8a30: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
8a40: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
8a50: 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c  ollSeq(db, pColl
8a60: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
8a70: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
8a80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61  ){.      if( nNa
8a90: 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  me<0 ){.        
8aa0: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
8ab0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
8ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8ad0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
8ae0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
8af0: 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c  sequence: %.*s",
8b00: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a   nName, zName);.
8b10: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b        pColl = 0;
8b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
8b30: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
8b40: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8b50: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
8b60: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
8b70: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
8b80: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
8b90: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
8ba0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
8bb0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
8bc0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
8bd0: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
8be0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
8bf0: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
8c00: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
8c10: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
8c20: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
8c30: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
8c40: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
8c50: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
8c60: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
8c70: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
8c80: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
8c90: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
8ca0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
8cb0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
8cc0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
8cd0: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
8ce0: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
8cf0: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
8d00: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
8d10: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
8d20: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
8d30: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
8d40: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
8d50: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
8d60: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
8d70: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
8d80: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
8d90: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
8da0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
8db0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
8dc0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
8dd0: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
8de0: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
8df0: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
8e00: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
8e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
8e20: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
8e30: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20  3 *db, Vdbe *v, 
8e40: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
8e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8e60: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
8e70: 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f  aDb[iDb].schema_
8e80: 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20  cookie+1, 0);.  
8e90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ea0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
8eb0: 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  , iDb, 0);.}../*
8ec0: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
8ed0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
8ee0: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
8ef0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
8f00: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
8f10: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
8f20: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
8f30: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
8f40: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
8f50: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
8f60: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
8f70: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
8f80: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
8f90: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
8fa0: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
8fb0: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
8fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
8fd0: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
8fe0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
8ff0: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
9000: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
9010: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
9020: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
9030: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
9040: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
9050: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
9060: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
9070: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
9080: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
9090: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
90a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
90b0: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
90c0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
90d0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
90e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
90f0: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
9100: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
9110: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
9120: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
9130: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
9140: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
9150: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
9160: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
9170: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
9180: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
9190: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
91a0: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
91b0: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
91c0: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
91d0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
91e0: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
91f0: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
9200: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
9210: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
9220: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
9230: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
9240: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
9250: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
9260: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
9270: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
9280: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
9290: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
92a0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
92b0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
92c0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
92d0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
92e0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
92f0: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
9300: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
9310: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
9320: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
9330: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
9340: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
9350: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
9360: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
9370: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
9380: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
9390: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
93a0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
93b0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
93c0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
93d0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
93e0: 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  End, *z;.  Colum
93f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
9400: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
9410: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
9420: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
9430: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
9440: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
9450: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  >zName);.    z =
9460: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
9470: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
9480: 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29   n += (strlen(z)
9490: 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   + 1);.    }.  }
94a0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
94b0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
94c0: 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20   if( n<50 ){.   
94d0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
94e0: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
94f0: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
9500: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
9510: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
9520: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
9530: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
9540: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
9550: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
9560: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
9570: 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28  cRaw( n );.  if(
9580: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
9590: 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a  rn 0;.  strcpy(z
95a0: 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d 50  Stmt, !OMIT_TEMP
95b0: 44 42 26 26 70 2d 3e 69 44 62 3d 3d 31 20 3f 20  DB&&p->iDb==1 ? 
95c0: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
95d0: 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54 41 42  LE ":"CREATE TAB
95e0: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72  LE ");.  k = str
95f0: 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  len(zStmt);.  id
9600: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
9610: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
9620: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
9630: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
9640: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
9650: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
9660: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
9670: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
9680: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
9690: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
96a0: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
96b0: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
96c0: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
96d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d  e);.    if( (z =
96e0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30   pCol->zType)!=0
96f0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b   ){.      zStmt[
9700: 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  k++] = ' ';.    
9710: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
9720: 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20  k], z);.      k 
9730: 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  += strlen(z);.  
9740: 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79    }.  }.  strcpy
9750: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64  (&zStmt[k], zEnd
9760: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
9770: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
9780: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9790: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
97a0: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
97b0: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
97c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
97d0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
97e0: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
97f0: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
9800: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
9810: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
9820: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
9830: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
9840: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
9850: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
9860: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
9870: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
9880: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
9890: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
98a0: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
98b0: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
98c0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
98d0: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
98e0: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
98f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
9900: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
9910: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
9920: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
9930: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
9940: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
9950: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
9960: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
9970: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
9980: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
9990: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
99a0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
99b0: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
99c0: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
99d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
99e0: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
99f0: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
9a00: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
9a10: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
9a20: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
9a30: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
9a40: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
9a50: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
9a60: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
9a70: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
9a80: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
9a90: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
9aa0: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
9ab0: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
9ac0: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
9ad0: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
9ae0: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
9af0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
9b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9b10: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
9b20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9b30: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
9b40: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
9b50: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
9b60: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
9b70: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
9b80: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
9b90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
9ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9bb0: 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65  e final ')' toke
9bc0: 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  n in the CREATE 
9bd0: 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63  TABLE */.  Selec
9be0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
9bf0: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
9c00: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
9c10: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
9c20: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
9c30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9c40: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
9c50: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
9c60: 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73  ect==0) || pPars
9c70: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
9c80: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
9c90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
9ca0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9cb0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
9cc0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
9cd0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
9ce0: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
9cf0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
9d00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
9d10: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
9d20: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
9d30: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
9d40: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
9d50: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
9d60: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
9d70: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
9d80: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
9d90: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
9da0: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
9db0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
9dc0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
9dd0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
9de0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
9df0: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
9e00: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
9e10: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
9e20: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
9e30: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
9e40: 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e.).  */.  if( d
9e50: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
9e60: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
9e70: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
9e80: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
9e90: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
9ea0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
9eb0: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
9ec0: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
9ed0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
9ee0: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
9ef0: 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f  abase.  The reco
9f00: 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  rd number.  ** f
9f10: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
9f20: 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c   entry should al
9f30: 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20  ready be on the 
9f40: 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
9f50: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
9f60: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
9f70: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
9f80: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
9f90: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
9fa0: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
9fb0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
9fc0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
9fd0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
9fe0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
9ff0: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
a000: 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
a010: 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
a020: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
a030: 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
a040: 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
a050: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
a060: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
a070: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
a080: 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
a090: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
a0a0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
a0b0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a0c0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
a0d0: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
a0e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a0f0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a  _Close, 0, 0);..
a100: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
a110: 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
a120: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64  he new table and
a130: 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68   push it onto th
a140: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  e stack..    ** 
a150: 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f  A view has no ro
a160: 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20  otpage, so just 
a170: 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f  push a zero onto
a180: 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20   the stack for. 
a190: 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e     ** views.  In
a1a0: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61  itialize zType a
a1b0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
a1c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
a1d0: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
a1e0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
a1f0: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
a200: 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
a210: 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
a220: 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e   = "TABLE";.#ifn
a230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a240: 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VIEW.    }else{.
a250: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
a260: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
a270: 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
a280: 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
a290: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
a2a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
a2b0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
a2c0: 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
a2d0: 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
a2e0: 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
a2f0: 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
a300: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
a310: 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
a320: 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
a330: 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
a340: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
a350: 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20  he vdbe stack.. 
a360: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
a370: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
a380: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
a390: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
a3a0: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
a3b0: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
a3c0: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
a3d0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
a3e0: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
a3f0: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
a400: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
a410: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
a420: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ect ){.      Tab
a430: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20  le *pSelTab;.   
a440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a450: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
a460: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a470: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a480: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69  OP_Integer, p->i
a490: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
a4a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a4b0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
a4c0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
a4d0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
a4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
a4f0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
a500: 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  ct, SRT_Table, 1
a510: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
a520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a530: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
a540: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
a550: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
a560: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
a570: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
a580: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
a590: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
a5a0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
a5b0: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
a5c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
a5d0: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
a5e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
a5f0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
a600: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
a610: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
a620: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
a630: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
a640: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
a650: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
a660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
a670: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
a680: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
a690: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
a6a0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
a6b0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
a6c0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
a6d0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
a6e0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
a6f0: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
a700: 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(p);.    }else{
a710: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d  .      n = pEnd-
a720: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
a730: 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20  meToken.z + 1;. 
a740: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
a750: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
a760: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
a770: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
a780: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
a790: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
a7a0: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
a7b0: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
a7c0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
a7d0: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
a7e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
a7f0: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
a800: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
a810: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
a820: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
a830: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
a840: 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64  cted.  The rowid
a850: 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f   for the preallo
a860: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f  cated.    ** slo
a870: 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65  t is the 2nd ite
a880: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
a890: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
a8a0: 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20  stack is the.   
a8b0: 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f   ** root page fo
a8c0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
a8d0: 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20  (or a 0 if this 
a8e0: 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20  is a view)..    
a8f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
a900: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
a910: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
a920: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
a930: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
a940: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
a950: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
a960: 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  #0, sql=%Q ".   
a970: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
a980: 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  =#1",.      db->
a990: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  aDb[p->iDb].zNam
a9a0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
a9b0: 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  p->iDb),.      z
a9c0: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
a9d0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
a9e0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Name,.      zStm
a9f0: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
aa00: 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a  iteFree(zStmt);.
aa10: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
aa20: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70  eCookie(db, v, p
aa30: 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  ->iDb);..#ifndef
aa40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
aa50: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
aa60: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
aa70: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  f we need to cre
aa80: 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65  ate an sqlite_se
aa90: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72  quence table for
aaa0: 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20  .    ** keeping 
aab0: 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63  track of autoinc
aac0: 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20  rement keys..   
aad0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   */.    if( p->a
aae0: 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20  utoInc ){.      
aaf0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
ab00: 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20  Db[p->iDb];.    
ab10: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 65 71 54    if( pDb->pSeqT
ab20: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
ab30: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
ab40: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
ab50: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
ab60: 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
ab70: 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
ab80: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
ab90: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
aba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
abb0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
abc0: 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
abd0: 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
abe0: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
abf0: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
ac00: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
ac10: 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
ac20: 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20  a, p->iDb, 0,.  
ac30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
ac40: 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27  intf("tbl_name='
ac50: 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20  %q'",p->zName), 
ac60: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P3_DYNAMIC);.  }
ac70: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
ac80: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
ac90: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
aca0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
acb0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
acc0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
acd0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
ace0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
acf0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
ad00: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44 62 20  *pFKey; .    Db 
ad10: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
ad20: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c  p->iDb];.    pOl
ad30: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
ad40: 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48  nsert(&pDb->tblH
ad50: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
ad60: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
ad70: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
ad80: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
ad90: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
ada0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
adb0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
adc0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
add0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
ade0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
adf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
ae00: 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70  GN_KEY.    for(p
ae10: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
ae20: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
ae30: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
ae40: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
ae50: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
ae60: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
ae70: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
ae80: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
ae90: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
aea0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
aeb0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
aec0: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
aed0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
aee0: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
aef0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
af00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
af10: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
af20: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
af30: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
af40: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
af50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
af60: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
af70: 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
af80: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
af90: 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
afa0: 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
afb0: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
afc0: 3d 3d 30 20 29 20 70 43 6f 6e 73 20 3d 20 70 45  ==0 ) pCons = pE
afd0: 6e 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  nd;.      p->add
afe0: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
aff0: 20 28 70 43 6f 6e 73 2d 3e 7a 20 2d 20 70 50 61   (pCons->z - pPa
b000: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
b010: 7a 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  z);.    }.#endif
b020: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
b030: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b040: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
b050: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
b060: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
b070: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
b080: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
b090: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
b0a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b0b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
b0c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
b0d0: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
b0e0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
b0f0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
b100: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
b110: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b120: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
b130: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
b140: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b150: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
b160: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
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 53   the view */.  S
b1a0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
b1b0: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
b1c0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
b1d0: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
b1e0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
b1f0: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
b200: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
b210: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
b220: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
b230: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
b240: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
b250: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
b260: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
b270: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20  Token *pName;.. 
b280: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
b290: 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
b2a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b2b0: 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
b2c0: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
b2d0: 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73  n views");.    s
b2e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
b2f0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
b300: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
b310: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
b320: 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c  (pParse, pBegin,
b330: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
b340: 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70   isTemp, 1);.  p
b350: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b360: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
b370: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
b380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
b390: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
b3a0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
b3b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
b3c0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
b3d0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
b3e0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
b3f0: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
b400: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
b410: 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20  p->iDb, "view", 
b420: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
b430: 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
b440: 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20  sFix, pSelect). 
b450: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
b460: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
b470: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
b480: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
b490: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
b4a0: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
b4b0: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
b4c0: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
b4d0: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
b4e0: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
b4f0: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
b500: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
b510: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
b520: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
b530: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
b540: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
b550: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
b560: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
b570: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
b580: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
b590: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
b5a0: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
b5b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b5c0: 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  Dup(pSelect);.  
b5d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
b5e0: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
b5f0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
b600: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
b610: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
b620: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
b630: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
b640: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
b650: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
b660: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
b670: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
b680: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
b690: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
b6a0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
b6b0: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
b6c0: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
b6d0: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
b6e0: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
b6f0: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
b700: 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20  0;.  n = sEnd.z 
b710: 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  - pBegin->z;.  z
b720: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
b730: 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d  ed char*)pBegin-
b740: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
b750: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
b760: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   || isspace(z[n-
b770: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
b780: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
b790: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
b7a0: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
b7b0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
b7c0: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
b7d0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
b7e0: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
b7f0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
b800: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
b810: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
b820: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b830: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
b840: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b850: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
b860: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b870: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
b880: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
b890: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
b8a0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
b8b0: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
b8c0: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
b8d0: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
b8e0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
b8f0: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
b900: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
b910: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b920: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
b930: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
b940: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
b950: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
b960: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
b970: 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
b980: 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
b990: 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
b9a0: 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
b9b0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
b9c0: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
b9d0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
b9e0: 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
b9f0: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
ba00: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
ba10: 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
ba20: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
ba30: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
ba40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
ba50: 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
ba60: 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
ba70: 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
ba80: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
ba90: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
baa0: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
bab0: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
bac0: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
bad0: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
bae0: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
baf0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
bb00: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
bb10: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
bb20: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
bb30: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
bb40: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
bb50: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
bb60: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
bb70: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
bb80: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
bb90: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
bba0: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
bbb0: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
bbc0: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
bbd0: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
bbe0: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
bbf0: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
bc00: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
bc10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
bc20: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
bc30: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
bc40: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
bc50: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
bc60: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
bc70: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
bc80: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
bc90: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
bca0: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
bcb0: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
bcc0: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
bcd0: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
bce0: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 23 69 66 20   safe..  */.#if 
bcf0: 30 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  0.  if( pTable->
bd00: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
bd10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bd20: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
bd30: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
bd40: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
bd50: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
bd60: 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 1;.  }.#endif.
bd70: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
bd80: 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
bd90: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
bda0: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
bdb0: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
bdc0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
bdd0: 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
bde0: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
bdf0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
be00: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
be10: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
be20: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
be30: 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
be40: 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
be50: 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
be60: 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
be70: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
be80: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
be90: 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
bea0: 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
beb0: 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
bec0: 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
bed0: 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
bee0: 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
bef0: 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
bf00: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
bf10: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
bf20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
bf30: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
bf40: 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
bf50: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c 65  SelectDup(pTable
bf60: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 20  ->pSelect);.  n 
bf70: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
bf80: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
bf90: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
bfa0: 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
bfb0: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  );.  pTable->nCo
bfc0: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
bfd0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
bfe0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
bff0: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
c000: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
c010: 6e 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  n;.  if( pSelTab
c020: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c030: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
c040: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
c050: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
c060: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
c070: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
c080: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
c090: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
c0a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c0b0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
c0c0: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
c0d0: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53  SelTab);.    DbS
c0e0: 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73  etProperty(pPars
c0f0: 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69  e->db, pTable->i
c100: 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  Db, DB_UnresetVi
c110: 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ews);.  }else{. 
c120: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
c130: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
c140: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
c150: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29  lectDelete(pSel)
c160: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  ;.  return nErr;
c170: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53    .}.#endif /* S
c180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
c190: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
c1a0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
c1b0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
c1c0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
c1d0: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
c1e0: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
c1f0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
c200: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
c210: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
c220: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
c230: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
c240: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
c250: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
c260: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
c270: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
c280: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
c290: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
c2a0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
c2b0: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
c2c0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
c2d0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
c2e0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
c2f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  ){.      sqliteR
c300: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
c310: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
c320: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
c330: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
c340: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
c350: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
c360: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
c370: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
c380: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c390: 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
c3a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c3b0: 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
c3c0: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
c3d0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
c3e0: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
c3f0: 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
c400: 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
c410: 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
c420: 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
c430: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
c440: 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
c450: 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
c460: 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
c470: 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  iTo..*/.#ifndef 
c480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
c490: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
c4a0: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
c4b0: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
c4c0: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
c4d0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
c4e0: 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ;.  .  for(pElem
c4f0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
c500: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b  (&pDb->tblHash);
c510: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
c520: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
c530: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
c540: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c550: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
c560: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
c570: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
c580: 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
c590: 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  To;.      return
c5a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
c5b0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
c5c0: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69 64  shFirst(&pDb->id
c5d0: 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  xHash); pElem; p
c5e0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
c5f0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
c600: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
c610: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
c620: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
c630: 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
c640: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
c650: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20  num = iTo;.     
c660: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
c670: 20 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a   }.  assert(0);.
c680: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c690: 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
c6a0: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
c6b0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
c6c0: 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
c6d0: 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
c6e0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
c6f0: 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
c700: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
c710: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
c720: 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
c730: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
c740: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
c750: 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
c760: 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
c770: 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
c780: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
c790: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
c7a0: 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
c7b0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
c7c0: 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
c7d0: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
c7e0: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
c7f0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
c800: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
c810: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c820: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
c830: 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b  y, iTable, iDb);
c840: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c850: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
c860: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
c870: 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65  pushes an intege
c880: 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
c890: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
c8a0: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
c8b0: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
c8c0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
c8d0: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
c8e0: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
c8f0: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
c900: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
c910: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
c920: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
c930: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
c940: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
c950: 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68  * The "#0" in th
c960: 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
c970: 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
c980: 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
c990: 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e  value.  ** is on
c9a0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
c9b0: 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69  stack.  See sqli
c9c0: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
c9d0: 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
c9e0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
c9f0: 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
ca00: 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
ca10: 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
ca20: 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  0 AND rootpage=#
ca30: 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  0",.     pParse-
ca40: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
ca50: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
ca60: 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b  E(iDb), iTable);
ca70: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ca80: 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
ca90: 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
caa0: 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
cab0: 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
cac0: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
cad0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
cae0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
caf0: 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
cb00: 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
cb10: 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
cb20: 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
cb30: 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
cb40: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
cb50: 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
cb60: 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
cb70: 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
cb80: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
cb90: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
cba0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
cbb0: 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
cbc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
cbd0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
cbe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
cbf0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
cc00: 78 20 2a 70 49 64 78 3b 0a 20 20 64 65 73 74 72  x *pIdx;.  destr
cc10: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
cc20: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70  e, pTab->tnum, p
cc30: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72  Tab->iDb);.  for
cc40: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
cc50: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
cc60: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
cc70: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
cc80: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
cc90: 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b  num, pIdx->iDb);
cca0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
ccb0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
ccc0: 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
ccd0: 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
cce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
ccf0: 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
cd00: 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
cd10: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
cd20: 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
cd30: 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
cd40: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
cd50: 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
cd60: 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
cd70: 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
cd80: 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
cd90: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
cda0: 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
cdb0: 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
cdc0: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
cdd0: 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
cde0: 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
cdf0: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
ce00: 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
ce10: 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
ce20: 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
ce30: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
ce40: 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
ce50: 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
ce60: 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
ce70: 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
ce80: 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
ce90: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
cea0: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
ceb0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cec0: 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
ced0: 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
cee0: 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
cef0: 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
cf00: 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
cf10: 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
cf20: 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
cf30: 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
cf40: 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
cf50: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
cf60: 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
cf70: 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
cf80: 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
cf90: 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
cfa0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
cfb0: 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
cfc0: 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
cfd0: 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
cfe0: 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
cff0: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
d000: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
d010: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d020: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d030: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
d040: 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
d050: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
d060: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 44  assert( pIdx->iD
d070: 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
d080: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
d090: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
d0a0: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
d0b0: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
d0c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
d0d0: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
d0e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d0f0: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 20  ( iLargest==0 ) 
d100: 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 65 73 74  return;.    dest
d110: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
d120: 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 70 54  se, iLargest, pT
d130: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 44  ab->iDb);.    iD
d140: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
d150: 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  est;.  }.#endif.
d160: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d170: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
d180: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
d190: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
d1a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
d1b0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
d1c0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
d1d0: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
d1e0: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
d1f0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
d200: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
d210: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  e, int isView){.
d220: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
d230: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
d240: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d250: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
d260: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
d270: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
d280: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
d290: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
d2a0: 61 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  able;.  assert( 
d2b0: 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
d2c0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
d2d0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
d2e0: 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
d2f0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
d300: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
d310: 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
d320: 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
d330: 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20  _table;.  iDb = 
d340: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73  pTab->iDb;.  ass
d350: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
d360: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69  Db<db->nDb );.#i
d370: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d380: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
d390: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
d3a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d3b0: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
d3c0: 54 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29  TABLE(pTab->iDb)
d3d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d3e0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
d3f0: 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
d400: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
d410: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
d420: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
d430: 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
d440: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
d450: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
d460: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
d470: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
d480: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
d490: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
d4a0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
d4b0: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
d4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4d0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
d4e0: 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
d4f0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d500: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
d510: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
d520: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
d530: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
d540: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
d550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d560: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
d570: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
d580: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
d590: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
d5a0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
d5b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
d5c0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
d5d0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
d5e0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
d5f0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
d600: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
d610: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
d620: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
d630: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
d640: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
d650: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
d660: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
d670: 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d  nly || pTab==db-
d680: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61  >aDb[iDb].pSeqTa
d690: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
d6a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d6b0: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
d6c0: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
d6d0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
d6e0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
d6f0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
d700: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d710: 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
d720: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
d730: 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
d740: 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
d750: 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
d760: 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
d770: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
d780: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
d790: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
d7a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d7b0: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
d7c0: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
d7d0: 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
d7e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
d7f0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
d800: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
d810: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
d820: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
d830: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d840: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
d850: 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
d860: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
d870: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
d880: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
d890: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
d8a0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
d8b0: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
d8c0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
d8d0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
d8e0: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
d8f0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d900: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
d910: 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
d920: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 69 6e  pTrigger;.    in
d930: 74 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44  t iDb = pTab->iD
d940: 62 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  b;.    Db *pDb =
d950: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
d960: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
d970: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d980: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
d990: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
d9a0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
d9b0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
d9c0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
d9d0: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
d9e0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
d9f0: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
da00: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
da10: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
da20: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
da30: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
da40: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
da50: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
da60: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
da70: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
da80: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
da90: 65 72 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20  er->iDb==iDb || 
daa0: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31  pTrigger->iDb==1
dab0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
dac0: 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
dad0: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
dae0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54 72 69  , 1);.      pTri
daf0: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
db00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23  >pNext;.    }..#
db10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
db20: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
db30: 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
db40: 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
db50: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
db60: 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
db70: 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74  ed with.    ** t
db80: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
db90: 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20  ropped. This is 
dba0: 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
dbb0: 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
dbc0: 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 62  .    ** at the b
dbd0: 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
dbe0: 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
dbf0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
dc00: 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f  eds to.    ** mo
dc10: 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
dc20: 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
dc30: 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
dc40: 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20  acuum mode)..   
dc50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
dc60: 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20  ->autoInc ){.   
dc70: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
dc80: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
dc90: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
dca0: 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71  OM %s.sqlite_seq
dcb0: 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
dcc0: 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44  =%Q",.        pD
dcd0: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
dce0: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
dcf0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
dd00: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
dd10: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
dd20: 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
dd30: 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
dd40: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c   the.    ** tabl
dd50: 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
dd60: 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
dd70: 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
dd80: 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
dd90: 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20     ** every row 
dda0: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
ddb0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
ddc0: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
ddd0: 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  ne being.    ** 
dde0: 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
ddf0: 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
de00: 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  perately because
de10: 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
de20: 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
de30: 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
de40: 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
de50: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
de60: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  another.    ** d
de70: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
de80: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
de90: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
dea0: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
deb0: 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
dec0: 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
ded0: 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
dee0: 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
def0: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
df00: 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
df10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
df20: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
df30: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
df40: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  arse, pTab);.   
df50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76   }..    /* Remov
df60: 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
df70: 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
df80: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
df90: 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a  and modify.    *
dfa0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
dfb0: 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  kie..    */.    
dfc0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
dfd0: 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
dfe0: 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  iDb, 0, pTab->zN
dff0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
e000: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
e010: 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
e020: 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  }.  sqliteViewRe
e030: 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
e040: 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
e050: 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
e060: 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
e070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e080: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e090: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
e0a0: 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e  w foreign key on
e0b0: 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75   the table.** cu
e0c0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
e0d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72  nstruction.  pFr
e0e0: 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73  omCol determines
e0f0: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a   which columns.*
e100: 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
e110: 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20   table point to 
e120: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e  the foreign key.
e130: 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30    If pFromCol==0
e140: 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74   then.** connect
e150: 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
e160: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65  last column inse
e170: 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68  rted.  pTo is th
e180: 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  e name of.** the
e190: 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
e1a0: 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  to.  pToCol is a
e1b0: 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
e1c0: 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  in the other.** 
e1d0: 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74  pTo table that t
e1e0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70  he foreign key p
e1f0: 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73  oints to.  flags
e200: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
e210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
e220: 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ut the conflict 
e230: 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
e240: 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a  ithms specified.
e250: 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c  ** in the ON DEL
e260: 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61  ETE, ON UPDATE a
e270: 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61  nd ON INSERT cla
e280: 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  uses..**.** An F
e290: 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73  Key structure is
e2a0: 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
e2b0: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
e2c0: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64  currently.** und
e2d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
e2e0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  in the pParse->p
e2f0: 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20  NewTable field. 
e300: 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a   The new FKey.**
e310: 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69   is not linked i
e320: 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74  nto db->aFKey at
e330: 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68   this point - th
e340: 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  at does not happ
e350: 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69  en.** until sqli
e360: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a  te3EndTable()..*
e370: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
e380: 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
e390: 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
e3a0: 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
e3b0: 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
e3c0: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
e3d0: 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
e3e0: 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
e3f0: 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
e400: 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
e410: 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
e420: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
e430: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e440: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
e450: 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
e460: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
e470: 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
e480: 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
e490: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
e4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
e4b0: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
e4c0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
e4d0: 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
e4e0: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
e4f0: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
e500: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
e510: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
e520: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
e530: 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23  orithms. */.){.#
e540: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e550: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
e560: 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
e570: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
e580: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
e590: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
e5a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
e5b0: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
e5c0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
e5d0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
e5e0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
e5f0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
e600: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
e610: 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
e620: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
e630: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f   if( iCol<0 ) go
e640: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
e650: 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
e660: 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
e670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
e680: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
e690: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
e6a0: 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
e6b0: 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
e6c0: 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
e6d0: 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
e6e0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
e6f0: 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
e700: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
e710: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
e720: 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
e730: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
e740: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
e750: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
e760: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e770: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
e780: 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
e790: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
e7a0: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
e7b0: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
e7c0: 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
e7d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
e7e0: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
e7f0: 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
e800: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
e810: 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
e820: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
e830: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
e840: 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f  ey) + nCol*sizeo
e850: 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
e860: 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
e870: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
e880: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e890: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
e8a0: 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
e8b0: 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c  += strlen(pToCol
e8c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
e8d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
e8e0: 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c  FKey = sqliteMal
e8f0: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
e900: 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67  if( pFKey==0 ) g
e910: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46  oto fk_end;.  pF
e920: 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
e930: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
e940: 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
e950: 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
e960: 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  ey[1];.  pFKey->
e970: 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73  aCol = (struct s
e980: 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b  ColMap*)z;.  z +
e990: 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  = sizeof(struct 
e9a0: 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20  sColMap)*nCol;. 
e9b0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
e9c0: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
e9d0: 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
e9e0: 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
e9f0: 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
ea00: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
ea10: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e   = 0;.  pFKey->n
ea20: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
ea30: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
ea40: 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
ea50: 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
ea60: 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
ea70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ea80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ea90: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
eaa0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
eab0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
eac0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
ead0: 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
eae0: 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
eaf0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
eb00: 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
eb10: 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
eb20: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
eb30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
eb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
eb50: 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
eb60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
eb70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
eb80: 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
eb90: 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
eba0: 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
ebb0: 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
ebc0: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
ebd0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
ebe0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
ebf0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
ec00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
ec10: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
ec20: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
ec30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
ec40: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
ec50: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
ec60: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
ec70: 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
ec80: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
ec90: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
eca0: 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
ecb0: 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
ecc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
ecd0: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
ece0: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64   = 0;.  pFKey->d
ecf0: 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67  eleteConf = flag
ed00: 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  s & 0xff;.  pFKe
ed10: 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20  y->updateConf = 
ed20: 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
ed30: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  0xff;.  pFKey->i
ed40: 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61  nsertConf = (fla
ed50: 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66  gs >> 16 ) & 0xf
ed60: 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  f;..  /* Link th
ed70: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
ed80: 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
ed90: 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
eda0: 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
edb0: 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
edc0: 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
edd0: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
ede0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
edf0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ee00: 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
ee10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
ee20: 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c  tDelete(pFromCol
ee30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
ee40: 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f  ListDelete(pToCo
ee50: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
ee60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ee70: 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
ee80: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
ee90: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
eea0: 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
eeb0: 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
eec0: 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
eed0: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
eee0: 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
eef0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
ef00: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
ef10: 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
ef20: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
ef30: 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
ef40: 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
ef50: 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
ef60: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
ef70: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
ef80: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
ef90: 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
efa0: 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
efb0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
efc0: 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
efd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
efe0: 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
eff0: 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
f000: 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
f010: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
f020: 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
f030: 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
f040: 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
f050: 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
f060: 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65  rred = isDeferre
f070: 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
f080: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f090: 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
f0a0: 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
f0b0: 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
f0c0: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
f0d0: 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
f0e0: 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
f0f0: 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
f100: 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
f110: 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
f120: 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
f130: 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
f140: 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
f150: 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
f160: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
f170: 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
f180: 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
f190: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73  he memory cell s
f1a0: 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
f1b0: 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
f1c0: 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
f1d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
f1e0: 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
f1f0: 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
f200: 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
f210: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
f220: 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
f230: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
f240: 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
f250: 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
f260: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
f270: 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
f280: 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
f290: 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
f2a0: 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
f2b0: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
f2c0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
f2d0: 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
f2e0: 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
f2f0: 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
f300: 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
f310: 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
f320: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
f330: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
f340: 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ;       /* Btree
f350: 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
f360: 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
f370: 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
f380: 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab+1;     /* Btr
f390: 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
f3a0: 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
f3b0: 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f3d0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
f3e0: 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
f3f0: 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
f400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f410: 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
f420: 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
f450: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
f460: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f470: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
f480: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
f490: 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
f4a0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
f4b0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
f4c0: 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
f4d0: 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70 50  ame, 0,.      pP
f4e0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 70 49  arse->db->aDb[pI
f4f0: 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  ndex->iDb].zName
f500: 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
f510: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
f520: 2f 2a 20 45 6e 73 75 72 65 20 61 6c 6c 20 74 68  /* Ensure all th
f530: 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 6c 61  e required colla
f540: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61  tion sequences a
f550: 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  re available. Th
f560: 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  is.  ** routine 
f570: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
f580: 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64  collation-needed
f590: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 6e 65 63   callback if nec
f5a0: 65 73 73 61 72 79 20 28 61 6e 64 0a 20 20 2a 2a  essary (and.  **
f5b0: 20 69 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   if one has been
f5c0: 20 72 65 67 69 73 74 65 72 65 64 29 2e 0a 20 20   registered)..  
f5d0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
f5e0: 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65  CheckIndexCollSe
f5f0: 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  q(pParse, pIndex
f600: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
f610: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
f620: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f630: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
f640: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
f650: 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
f660: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f670: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
f680: 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65  oad, memRootPage
f690: 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d  , 0);.    tnum =
f6a0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
f6b0: 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
f6c0: 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  tnum;.    sqlite
f6d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f6e0: 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70 49  _Clear, tnum, pI
f6f0: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a  ndex->iDb);.  }.
f700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f710: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
f720: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30  , pIndex->iDb, 0
f730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f740: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
f750: 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
f760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f770: 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e       (char*)&pIn
f780: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33  dex->keyInfo, P3
f790: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
f7a0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72  ite3OpenTableFor
f7b0: 52 65 61 64 69 6e 67 28 76 2c 20 69 54 61 62 2c  Reading(v, iTab,
f7c0: 20 70 54 61 62 29 3b 0a 20 20 61 64 64 72 31 20   pTab);.  addr1 
f7d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f7e0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
f7f0: 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c   iTab, 0);.  sql
f800: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
f810: 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20  xKey(v, pIndex, 
f820: 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70 49 6e  iTab);.  if( pIn
f830: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
f840: 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  _None ){.    int
f850: 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c 69 74   curaddr = sqlit
f860: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f870: 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 61 64  r(v);.    int ad
f880: 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b 34 3b  dr2 = curaddr+4;
f890: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f8a0: 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75 72 61  ChangeP2(v, cura
f8b0: 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b 0a 20  ddr-1, addr2);. 
f8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f8d0: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  dOp(v, OP_Rowid,
f8e0: 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   iTab, 0);.    s
f8f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f900: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
f910: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f920: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f930: 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 20  IsUnique, iIdx, 
f940: 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69  addr2);.    sqli
f950: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
f960: 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f  _Halt, SQLITE_CO
f970: 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41 62 6f  NSTRAINT, OE_Abo
f980: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
f990: 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64          "indexed
f9a0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
f9b0: 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41   unique", P3_STA
f9c0: 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TIC);.    assert
f9d0: 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74 65 33  ( addr2==sqlite3
f9e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f9f0: 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  v) );.  }.  sqli
fa00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fa10: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
fa20: 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  dx, 0);.  sqlite
fa30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fa40: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
fa50: 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r1+1);.  sqlite3
fa60: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
fa70: 61 64 64 72 31 2c 20 73 71 6c 69 74 65 33 56 64  addr1, sqlite3Vd
fa80: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
fa90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
faa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
fab0: 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73  e, iTab, 0);.  s
fac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fad0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
fae0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
faf0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
fb00: 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
fb10: 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
fb20: 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
fb30: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
fb40: 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
fb50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
fb60: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
fb70: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
fb80: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
fb90: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
fba0: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
fbb0: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
fbc0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
fbd0: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
fbe0: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
fbf0: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
fc00: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
fc10: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
fc20: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
fc30: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
fc40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
fc50: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
fc60: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
fc70: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
fc80: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
fc90: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
fca0: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
fcb0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
fcc0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
fcd0: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
fce0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
fcf0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
fd00: 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
fd10: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
fd20: 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
fd30: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
fd40: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
fd50: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
fd60: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
fd70: 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
fd80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
fd90: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
fda0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
fdb0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
fdc0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
fdd0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
fde0: 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
fdf0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
fe00: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
fe10: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
fe20: 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
fe30: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
fe40: 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
fe50: 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
fe60: 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
fe70: 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
fe80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
fe90: 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
fea0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
feb0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
fec0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
fed0: 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
fee0: 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
fef0: 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
ff00: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
ff10: 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
ff20: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
ff30: 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41  at begins a CREA
ff40: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
ff50: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
ff60: 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 54 68  End        /* Th
ff70: 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
ff80: 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
ff90: 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
ffa0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
ffb0: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c 65   = 0;   /* Table
ffc0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
ffd0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
ffe0: 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e  x = 0; /* The in
fff0: 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
10000 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
10010 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
10020 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
10030 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74  Id;    /* Fake t
10040 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
10050 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
10060 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
10070 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
10080 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
10090 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 73  to pTable */.  s
100a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
100b0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20  rse->db;..  int 
100c0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  iDb;          /*
100d0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
100e0 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
100f0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
10100 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
10110 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69   0; /* Unqualifi
10120 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
10130 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
10140 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
10150 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
10160 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
10170 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10180 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
10190 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
101a0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
101b0 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
101c0 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
101d0 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
101e0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
101f0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
10200 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
10210 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
10230 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
10240 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
10250 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
10260 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
10270 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
10280 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
10290 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
102a0 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
102b0 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
102c0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
102d0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
102e0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
102f0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
10300 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
10310 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10330 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
10340 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
10350 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
10360 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
10370 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  he the table.   
10380 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
10390 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
103a0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
103b0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  1..    */.    pT
103c0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
103d0 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
103e0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
103f0 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70   if( pName2 && p
10400 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
10410 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62  Tab && pTab->iDb
10420 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62  ==1 ){.      iDb
10430 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
10440 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  if..    if( sqli
10450 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
10460 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
10470 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
10480 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
10490 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
104a0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
104b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
104c0 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
104d0 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
104e0 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
104f0 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
10500 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
10510 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
10520 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
10530 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
10540 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
10550 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
10560 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
10570 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a  e->a[0].zName, .
10580 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65          pTblName
10590 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
105a0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
105b0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
105c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
105d0 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62  ssert( iDb==pTab
105e0 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65  ->iDb );.  }else
105f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
10600 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
10610 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
10620 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62  ewTable;.    iDb
10630 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
10640 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  }..  if( pTab==0
10650 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10660 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
10670 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
10680 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
10690 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
106a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
106b0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
106c0 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
106d0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
106e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
106f0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
10700 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10710 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
10720 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
10730 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10740 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
10750 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
10760 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
10770 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10780 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
10790 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
107a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
107b0 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
107c0 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
107d0 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
107e0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
107f0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
10800 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
10810 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
10820 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
10830 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
10840 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
10850 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
10860 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
10870 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
10880 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
10890 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
108a0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
108b0 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
108c0 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
108d0 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
108e0 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
108f0 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
10900 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
10910 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
10920 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
10930 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
10940 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
10950 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
10960 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
10970 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
10980 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
10990 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
109a0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
109b0 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
109c0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
109d0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
109e0 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  n(pName);.    if
109f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
10a00 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
10a10 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
10a20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10a30 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
10a40 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10a50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10a60 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
10a70 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
10a80 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
10a90 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
10aa0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10ab0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
10ac0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
10ad0 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sy ){.      if( 
10ae0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
10af0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
10b00 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
10b10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10b20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10b30 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
10b40 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
10b50 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
10b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
10b70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10b80 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
10b90 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
10ba0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
10bb0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10bd0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
10be0 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
10bf0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
10c00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10c10 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
10c20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
10c30 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
10c40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
10c50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10c60 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
10c70 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
10c80 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
10c90 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
10ca0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
10cb0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
10cc0 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
10cd0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
10ce0 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
10cf0 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
10d00 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a  ,"_%d",n);.    z
10d10 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Name = 0;.    sq
10d20 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
10d30 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
10d40 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62  utoindex_", pTab
10d50 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28  ->zName, zBuf, (
10d60 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66  char*)0);.    if
10d70 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
10d80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10d90 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  dex;.  }..  /* C
10da0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
10db0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
10dc0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
10dd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10de0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
10df0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
10e00 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
10e10 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
10e20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
10e30 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
10e40 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
10e50 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
10e60 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
10e70 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
10e80 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10e90 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
10ea0 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
10eb0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
10ec0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
10ed0 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
10ee0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
10ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
10f00 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
10f10 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
10f20 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
10f30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
10f40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10f50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
10f60 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
10f70 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
10f80 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
10f90 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
10fa0 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
10fb0 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
10fc0 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
10fd0 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
10fe0 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
10ff0 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
11000 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
11010 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
11020 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
11030 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
11040 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
11050 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
11060 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
11070 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
11080 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
11090 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
110a0 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
110b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
110c0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
110d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
110e0 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
110f0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
11100 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
11110 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
11120 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
11130 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a  ndex) + strlen(z
11140 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73 69 7a 65  Name) + 1 + size
11150 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20 20 20 20  of(int) +.      
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32    (sizeof(int)*2
11180 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   + sizeof(CollSe
11190 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  q*))*pList->nExp
111a0 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  r );.  if( sqlit
111b0 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
111c0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
111d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e  ate_index;.  pIn
111e0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
111f0 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  (int*)&pIndex->k
11200 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69  eyInfo.aColl[pLi
11210 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49  st->nExpr];.  pI
11220 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
11230 20 28 75 6e 73 69 67 6e 65 64 2a 29 26 70 49 6e   (unsigned*)&pIn
11240 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
11250 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70  ist->nExpr];.  p
11260 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
11270 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61  char*)&pIndex->a
11280 69 52 6f 77 45 73 74 5b 70 4c 69 73 74 2d 3e 6e  iRowEst[pList->n
11290 45 78 70 72 2b 31 5d 3b 0a 20 20 73 74 72 63 70  Expr+1];.  strcp
112a0 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
112b0 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
112c0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
112d0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
112e0 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
112f0 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
11300 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
11310 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
11320 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
11330 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d  .  pIndex->iDb =
11340 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e   iDb;..  /* Scan
11350 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
11360 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
11370 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
11380 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
11390 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
113a0 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
113b0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
113c0 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
113d0 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
113e0 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
113f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
11400 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
11410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
11420 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
11430 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
11440 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11450 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
11460 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
11470 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
11480 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11490 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
114a0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
114b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
114c0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
114d0 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
114e0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
114f0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74  ab->zName, pList
11500 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
11510 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11520 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11530 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
11540 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
11550 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
11560 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  [i].pExpr ){.   
11570 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
11580 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43  ->a[i].pExpr->pC
11590 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e  oll );.      pIn
115a0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
115b0 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61  ll[i] = pList->a
115c0 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  [i].pExpr->pColl
115d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
115e0 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e     pIndex->keyIn
115f0 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54  fo.aColl[i] = pT
11600 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c  ab->aCol[j].pCol
11610 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  l;.    }.    ass
11620 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79  ert( pIndex->key
11630 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b  Info.aColl[i] );
11640 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
11650 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20  it.busy && .    
11660 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
11670 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11680 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
11690 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29  aColl[i]) .    )
116a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
116b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
116c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64      }.  }.  pInd
116d0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65  ex->keyInfo.nFie
116e0 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ld = pList->nExp
116f0 72 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61  r;.  sqlite3Defa
11700 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
11710 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
11720 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11730 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
11740 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
11750 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
11760 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
11770 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
11780 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
11790 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
117a0 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
117b0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
117c0 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
117d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
117e0 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
117f0 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
11800 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
11810 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
11820 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
11830 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
11840 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
11850 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
11860 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
11870 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
11880 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
11890 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
118a0 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
118b0 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
118c0 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
118d0 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
118e0 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
118f0 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
11900 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
11910 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
11920 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
11930 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
11940 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
11950 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
11960 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
11970 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
11980 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
11990 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
119a0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
119b0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
119c0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
119d0 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
119e0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
119f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
11a00 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
11a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
11a20 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
11a30 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
11a40 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
11a50 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
11a60 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
11a70 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
11a80 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
11a90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11aa0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
11ab0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
11ac0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
11ad0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
11ae0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
11af0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79  [k]!=pIndex->key
11b00 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20  Info.aColl[k] ) 
11b10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
11b20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
11b30 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
11b40 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
11b50 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
11b60 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
11b70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
11b80 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
11b90 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
11ba0 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
11bb0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
11bc0 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
11bd0 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
11be0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
11bf0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
11c00 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
11c10 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
11c20 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
11c30 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
11c40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
11c50 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
11c60 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
11c70 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
11c80 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
11c90 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
11ca0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
11cb0 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
11cc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
11cd0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
11ce0 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
11cf0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
11d00 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
11d10 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
11d20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
11d30 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
11d40 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
11d50 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
11d60 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
11d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11d80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11da0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
11db0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
11dc0 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
11dd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11de0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
11df0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
11e00 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
11e10 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
11e20 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
11e30 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
11e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11e50 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
11e60 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
11e70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
11e80 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
11e90 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
11ea0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
11eb0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
11ec0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
11ed0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
11ee0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
11ef0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
11f00 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
11f10 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
11f20 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
11f30 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48  Index->iDb].idxH
11f40 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11f60 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74  Index->zName, st
11f70 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rlen(pIndex->zNa
11f80 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a  me)+1, pIndex);.
11f90 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
11fa0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
11fb0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
11fc0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
11fd0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  led */.      got
11fe0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11ff0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
12000 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
12010 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
12020 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
12030 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  me!=0 ){.      p
12040 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
12050 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
12060 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12070 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
12080 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
12090 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
120a0 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
120b0 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
120c0 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
120d0 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
120e0 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
120f0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
12100 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
12110 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
12120 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
12130 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
12140 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
12150 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
12160 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
12170 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
12180 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
12190 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
121a0 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
121b0 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
121c0 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
121d0 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
121e0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
121f0 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
12200 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
12210 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
12220 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
12230 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
12240 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
12250 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
12260 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
12270 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
12280 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
12290 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
122a0 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
122b0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
122c0 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
122d0 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
122e0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
122f0 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
12300 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
12310 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
12320 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
12330 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
12340 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
12350 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
12360 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
12370 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  sy==0 ){.    Vdb
12380 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
12390 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
123a0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
123b0 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73  em++;..    v = s
123c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
123d0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
123e0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
123f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
12400 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
12410 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
12420 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
12430 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
12440 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
12450 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
12460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12470 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
12480 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a  Index, iDb, 0);.
12490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
124a0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
124b0 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a  ore, iMem, 0);..
124c0 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
124d0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
124e0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
124f0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
12500 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
12510 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
12520 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
12530 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
12540 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
12550 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
12560 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
12570 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
12580 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
12590 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52  lite3MPrintf("CR
125a0 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
125b0 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72  s",.        onEr
125c0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
125d0 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20  " : " UNIQUE",. 
125e0 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d         pEnd->z -
125f0 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20   pName->z + 1,. 
12600 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29         pName->z)
12610 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12620 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
12630 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
12640 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
12650 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
12660 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
12670 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  /* zStmt = sqlit
12680 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a  e3MPrintf(""); *
12690 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
126a0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
126b0 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
126c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
126d0 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
126e0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
126f0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
12700 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  se, .        "IN
12710 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
12720 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
12730 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20  Q,%Q,#0,%Q);",. 
12740 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
12750 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
12760 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
12770 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
12780 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61  ame,.        pTa
12790 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
127a0 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
127b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
127c0 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
127d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
127e0 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20  Free(zStmt);..  
127f0 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e    /* Fill the in
12800 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e  dex with data an
12810 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63  d reparse the sc
12820 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50  hema. Code an OP
12830 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74  _Expire.    ** t
12840 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  o invalidate all
12850 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
12860 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f  atements..    */
12870 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
12880 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
12890 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
128a0 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d  arse, pIndex, iM
128b0 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
128c0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
128d0 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
128e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
128f0 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
12900 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20  ma, iDb, 0,.    
12910 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
12920 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c  ntf("name='%q'",
12930 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c   pIndex->zName),
12940 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
12950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12960 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69 72  ddOp(v, OP_Expir
12970 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  e, 0, 0);.    }.
12980 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
12990 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
129a0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
129b0 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
129c0 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
129d0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
129e0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
129f0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
12a00 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
12a10 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
12a20 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
12a30 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
12a40 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
12a50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
12a60 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
12a70 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
12a80 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
12a90 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
12aa0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
12ab0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
12ac0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
12ad0 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
12ae0 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
12af0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
12b00 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
12b10 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
12b20 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
12b30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12b40 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
12b50 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
12b60 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
12b70 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
12b80 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
12b90 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
12ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
12bb0 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
12bc0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
12bd0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
12be0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
12bf0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
12c00 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
12c10 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
12c20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
12c30 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
12c40 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
12c50 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
12c60 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
12c70 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
12c80 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
12c90 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
12ca0 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
12cb0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
12cc0 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
12cd0 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
12ce0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
12cf0 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
12d00 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
12d10 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
12d20 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
12d30 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
12d40 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
12d50 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
12d60 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
12d70 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
12d80 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
12d90 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
12da0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
12db0 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
12dc0 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
12dd0 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
12de0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
12df0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
12e00 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
12e10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
12e20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
12e30 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
12e40 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
12e50 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
12e60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
12e70 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
12e80 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
12e90 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
12ea0 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
12eb0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
12ec0 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
12ed0 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
12ee0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
12ef0 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
12f00 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
12f10 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
12f20 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
12f30 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
12f40 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
12f50 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
12f60 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
12f70 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
12f80 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
12f90 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
12fa0 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
12fb0 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
12fc0 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
12fd0 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
12fe0 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
12ff0 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
13000 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
13010 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
13020 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
13030 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
13040 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
13050 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
13060 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  ed *a = pIdx->ai
13070 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
13080 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
13090 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
130a0 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64  000;.  for(i=pId
130b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31  x->nColumn; i>=1
130c0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i--){.    a[i]
130d0 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28   = 10;.  }.  if(
130e0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
130f0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
13100 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
13110 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
13120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
13130 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
13140 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
13150 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
13160 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
13170 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
13180 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
13190 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
131a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
131b0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b  SrcList *pName){
131c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
131d0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
131e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
131f0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
13200 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
13210 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
13220 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
13230 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
13240 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
13250 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
13260 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
13270 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
13280 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
13290 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
132a0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
132b0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
132c0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
132d0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
132e0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
132f0 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
13300 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
13310 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13320 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
13330 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
13340 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
13350 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
13360 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
13370 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13380 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
13390 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
133a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
133b0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
133c0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
133d0 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
133e0 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
133f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
13400 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
13410 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
13420 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13430 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13440 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
13450 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
13460 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
13470 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
13480 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
13490 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
134a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
134b0 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  = db->aDb[pIndex
134c0 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
134d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
134e0 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
134f0 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  E(pIndex->iDb);.
13500 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
13510 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
13520 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
13530 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
13540 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13550 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
13560 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
13570 5f 54 45 4d 50 44 42 20 26 26 20 70 49 6e 64 65  _TEMPDB && pInde
13580 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20  x->iDb ) code = 
13590 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
135a0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
135b0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
135c0 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
135d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
135e0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
135f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13600 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13610 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13620 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
13630 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
13640 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
13650 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
13660 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
13670 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13680 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
13690 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e 64    int iDb = pInd
136a0 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c  ex->iDb;.    sql
136b0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
136c0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
136d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
136e0 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  s WHERE name=%Q"
136f0 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
13700 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
13710 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
13720 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
13730 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
13740 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
13750 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
13760 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
13770 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
13780 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
13790 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
137a0 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op3(v, OP_DropIn
137b0 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e  dex, iDb, 0, pIn
137c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
137d0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
137e0 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
137f0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
13800 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70  me);.}../*.** pp
13810 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e 74  Array points int
13820 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77 68  o a structure wh
13830 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
13840 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a 2a  array pointer.**
13850 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f   followed by two
13860 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66   integers. The f
13870 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73 20  irst integer is 
13880 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
13890 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
138a0 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61 79   structure array
138b0 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  .  The second in
138c0 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65 20  teger.** is the 
138d0 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61  number of alloca
138e0 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68 65  ted slots in the
138f0 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e   array..**.** In
13900 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
13910 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b  e structure look
13920 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  s something like
13930 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
13940 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d 70      struct Examp
13950 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  le1 {.**        
13960 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65 6d    struct subElem
13970 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20   *aEntry;.**    
13980 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79        int nEntry
13990 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  ;.**          in
139a0 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20  t nAlloc;.**    
139b0 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20      }.**.** The 
139c0 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74 65  pnEntry paramete
139d0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
139e0 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45 78  equivalent of Ex
139f0 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a  ample1.nEntry..*
13a00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13a10 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  e allocates a ne
13a20 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61 72  w slot in the ar
13a30 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f 75  ray, zeros it ou
13a40 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  t,.** and return
13a50 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49 66  s its index.  If
13a60 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61 20   malloc fails a 
13a70 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
13a80 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
13a90 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74 68  ** szEntry is th
13aa0 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73 69  e sizeof of a si
13ab0 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72 79  ngle array entry
13ac0 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74  .  initSize is t
13ad0 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
13ae0 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20 61   array entries a
13af0 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20  llocated on the 
13b00 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69  initial allocati
13b10 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
13b20 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
13b30 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c 20  void **ppArray, 
13b40 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e 74  int szEntry, int
13b50 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63 68   initSize){.  ch
13b60 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61 6e  ar *p;.  int *an
13b70 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72 61   = (int*)&ppArra
13b80 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b 30  y[1];.  if( an[0
13b90 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  ]>=an[1] ){.    
13ba0 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20  void *pNew;.    
13bb0 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  int newSize;.   
13bc0 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31 5d   newSize = an[1]
13bd0 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
13be0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
13bf0 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61 79  Realloc(*ppArray
13c00 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72  , newSize*szEntr
13c10 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
13c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
13c30 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
13c40 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69 7a    an[1] = newSiz
13c50 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79 20  e;.    *ppArray 
13c60 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20  = pNew;.  }.  p 
13c70 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d 65  = *ppArray;.  me
13c80 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a  mset(&p[an[0]*sz
13c90 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
13ca0 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6e  ry);.  return an
13cb0 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  [0]++;.}../*.** 
13cc0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
13cd0 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
13ce0 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
13cf0 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
13d00 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
13d10 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
13d20 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
13d30 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
13d40 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
13d50 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
13d60 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
13d70 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
13d80 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
13d90 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13da0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
13db0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
13dc0 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
13dd0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13de0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
13df0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
13e00 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c 69  ;.  }.  i = sqli
13e10 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
13e20 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74 2d  ((void**)&pList-
13e30 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  >a, sizeof(pList
13e40 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20 69  ->a[0]), 5);.  i
13e50 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
13e60 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
13e70 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  e(pList);.    re
13e80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
13e90 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
13ea0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
13eb0 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
13ec0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
13ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
13ee0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
13ef0 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
13f00 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
13f10 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
13f20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13f30 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
13f40 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
13f50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
13f60 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
13f70 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
13f80 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
13f90 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
13fa0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
13fb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13fc0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
13fd0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
13fe0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
13ff0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
14000 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
14010 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
14020 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
14030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14040 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
14050 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
14060 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
14070 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
14080 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
14090 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
140a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
140b0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
140c0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
140d0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
140e0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
140f0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
14100 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
14110 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
14120 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
14130 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
14140 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
14150 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
14160 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
14170 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
14180 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
14190 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
141a0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
141b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
141c0 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
141d0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
141e0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
141f0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
14200 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
14210 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
14220 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
14230 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
14240 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
14250 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
14260 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
14270 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
14280 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
14290 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
142a0 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
142b0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
142c0 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
142d0 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
142e0 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
142f0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
14300 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
14310 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
14320 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
14330 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
14340 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
14350 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
14360 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
14370 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
14380 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
14390 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
143a0 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
143b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
143c0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
143d0 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,0);.**.** T
143e0 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
143f0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
14400 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
14410 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
14420 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
14430 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
14440 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14450 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
14460 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
14470 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
14480 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
14490 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
144a0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
144b0 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c  cListAppend(SrcL
144c0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
144d0 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e  n *pTable, Token
144e0 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *pDatabase){.  
144f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14500 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
14510 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
14520 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
14530 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53  Malloc( sizeof(S
14540 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
14550 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14560 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
14570 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
14580 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
14590 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c  nSrc>=pList->nAl
145a0 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
145b0 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c  st *pNew;.    pL
145c0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32  ist->nAlloc *= 2
145d0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
145e0 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
145f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14600 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
14610 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
14620 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
14630 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
14640 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
14650 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
14660 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
14670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
14680 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
14690 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
146a0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
146b0 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
146c0 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
146d0 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
146e0 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
146f0 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
14700 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
14710 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
14720 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
14730 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
14740 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
14750 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
14760 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
14770 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
14780 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
14790 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
147a0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
147b0 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20  Token(pTable);. 
147c0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
147d0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
147e0 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61  romToken(pDataba
147f0 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
14800 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
14810 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
14820 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
14830 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
14840 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
14850 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
14860 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
14870 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
14880 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
14890 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
148a0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
148b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
148c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72  em *pItem;.  for
148d0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
148e0 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
148f0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
14900 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
14910 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20  m->iCursor>=0 ) 
14920 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 6d  break;.    pItem
14930 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
14940 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14950 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
14960 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
14970 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
14980 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
14990 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
149a0 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSrc);.    }.  }
149b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
149c0 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
149d0 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
149e0 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
149f0 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
14a00 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
14a10 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69  stAddAlias(SrcLi
14a20 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
14a30 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
14a40 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
14a50 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70  >nSrc>0 ){.    p
14a60 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
14a70 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20  Src-1].zAlias = 
14a80 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14a90 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20  oken(pToken);.  
14aa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
14ab0 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
14ac0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
14ad0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
14ae0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
14af0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
14b00 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29  (SrcList *pList)
14b10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
14b20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14b30 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
14b40 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14b50 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
14b60 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
14b70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
14b80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
14b90 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
14ba0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
14bb0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
14bc0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
14bd0 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
14be0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
14bf0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
14c00 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  (0, pItem->pTab)
14c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
14c20 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  ectDelete(pItem-
14c30 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
14c40 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14c50 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  (pItem->pOn);.  
14c60 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
14c70 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73  elete(pItem->pUs
14c80 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
14c90 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
14ca0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
14cb0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
14cc0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
14cd0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
14ce0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
14cf0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
14d00 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
14d10 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
14d20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14d30 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14d40 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14d50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14d60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14d70 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14d80 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14d90 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14da0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14db0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14dc0 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
14dd0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14de0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14df0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14e00 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
14e10 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
14e20 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
14e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
14e40 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
14e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14e60 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
14e70 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
14e80 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
14e90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
14ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14eb0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
14ec0 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
14ed0 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
14ee0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
14ef0 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
14f00 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
14f10 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
14f20 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
14f30 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14f40 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14f50 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14f60 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14f70 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14f80 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14f90 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14fa0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
14fb0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14fc0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14fd0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
14fe0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
14ff0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
15000 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15010 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
15020 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15030 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
15040 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29  utoCommit, 1, 0)
15050 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
15060 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
15070 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
15080 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61  lite3RollbackTra
15090 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
150a0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
150b0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
150c0 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
150d0 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
150e0 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
150f0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
15100 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
15110 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
15120 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
15130 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
15140 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15150 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
15160 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
15170 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
15180 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
15190 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
151a0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
151b0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
151c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
151d0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
151e0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
151f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15200 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
15210 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
15220 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
15230 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
15240 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
15250 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
15260 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
15270 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
15280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15290 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
152a0 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
152b0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
152c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
152d0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
152e0 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
152f0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
15300 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
15310 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
15320 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41  ory(db, 0, 0, MA
15330 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
15340 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
15350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15360 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15370 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15380 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
15390 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
153a0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
153b0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
153c0 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
153d0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
153e0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
153f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15400 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
15410 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74  flags & !db->aut
15420 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
15430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
15440 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d  eeBeginTrans(db-
15450 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b  >aDb[1].pBt, 1);
15460 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15470 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15480 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15490 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
154a0 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
154b0 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
154c0 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
154d0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
154e0 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ile");.        p
154f0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
15500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
15510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15520 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
15530 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15540 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
15550 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
15560 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
15570 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
15580 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
15590 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
155a0 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
155b0 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
155c0 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
155d0 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
155e0 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
155f0 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
15600 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
15610 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
15620 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
15630 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
15640 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
15650 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
15660 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
15670 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
15680 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
15690 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
156a0 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
156b0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
156c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
156d0 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
156e0 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
156f0 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
15700 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
15710 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
15720 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
15730 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
15740 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
15750 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
15760 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
15770 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
15780 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
15790 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
157a0 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
157b0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
157c0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
157d0 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
157e0 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
157f0 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
15800 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
15810 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
15820 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
15830 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
15840 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
15850 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
15860 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
15870 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
15880 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
15890 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
158a0 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
158b0 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
158c0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
158d0 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
158e0 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
158f0 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
15900 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
15910 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
15920 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
15930 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
15940 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
15950 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
15960 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
15970 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
15980 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
15990 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
159a0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
159b0 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
159c0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
159d0 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
159e0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
159f0 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76    int mask;..  v
15a00 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15a10 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15a20 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   v==0 ) return; 
15a30 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
15a40 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77  ppens if there w
15a50 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  as a prior error
15a60 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
15a70 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
15a80 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  rse->cookieGoto=
15a90 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
15aa0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73  ->cookieGoto = s
15ab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15ac0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
15ad0 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
15ae0 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
15af0 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
15b00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15b10 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
15b20 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
15b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
15b40 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20  <32 );.    mask 
15b50 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66  = 1<<iDb;.    if
15b60 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ( (pParse->cooki
15b70 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
15b80 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15b90 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20  ->cookieMask |= 
15ba0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72  mask;.      pPar
15bb0 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
15bc0 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  iDb] = db->aDb[i
15bd0 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
15be0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e;.      if( !OM
15bf0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15c00 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
15c10 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
15c20 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a  tabase(pParse);.
15c30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15c40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
15c50 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
15c60 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
15c70 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
15c80 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
15c90 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
15ca0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
15cb0 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
15cc0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
15cd0 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
15ce0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
15cf0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
15d00 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
15d10 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
15d20 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
15d30 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
15d40 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
15d50 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
15d60 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
15d70 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
15d80 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
15d90 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
15da0 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
15db0 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
15dc0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
15dd0 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
15de0 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
15df0 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
15e00 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
15e10 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
15e20 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
15e30 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
15e40 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
15e50 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
15e60 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
15e70 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
15e80 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
15e90 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
15ea0 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
15eb0 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
15ec0 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
15ed0 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
15ee0 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a   not be set..**.
15ef0 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65  ** Only database
15f00 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d   iDb and the tem
15f10 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
15f20 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20  ade writable by 
15f30 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66  this call..** If
15f40 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68   iDb==0, then th
15f50 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20  e main and temp 
15f60 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61  databases are ma
15f70 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49  de writable.   I
15f80 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e  f.** iDb==1 then
15f90 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64   only the temp d
15fa0 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20  atabase is made 
15fb0 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44  writable.  If iD
15fc0 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  b>1 then the.** 
15fd0 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69  specified auxili
15fe0 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64  ary database and
15ff0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
16000 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
16010 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
16020 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
16030 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
16040 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
16050 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
16060 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
16070 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16080 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
16090 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
160a0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
160b0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
160c0 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77  Db);.  pParse->w
160d0 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  riteMask |= 1<<i
160e0 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61  Db;.  if( setSta
160f0 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65  tement && pParse
16100 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
16110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16120 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d  dOp(v, OP_Statem
16130 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ent, iDb, 0);.  
16140 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45  }.  if( (OMIT_TE
16150 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20  MPDB || iDb!=1) 
16160 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  && pParse->db->a
16170 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a  Db[1].pBt!=0 ){.
16180 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
16190 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
161a0 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d  Parse, setStatem
161b0 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  ent, 1);.  }.}..
161c0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
161d0 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
161e0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
161f0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
16200 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
16210 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
16220 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
16230 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
16240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
16250 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
16260 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f  ollationMatch(Co
16270 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e  llSeq *pColl, In
16280 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
16290 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  int n = pIndex->
162a0 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a  keyInfo.nField;.
162b0 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d    CollSeq **pp =
162c0 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
162d0 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  .aColl;.  while(
162e0 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20   n-- ){.    if( 
162f0 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74  *pp==pColl ) ret
16300 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b  urn 1;.    pp++;
16310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16320 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16330 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
16340 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
16350 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
16360 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
16370 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
16380 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
16390 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
163a0 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
163b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
163c0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
163d0 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
163e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
163f0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c  Table *pTab, Col
16400 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
16410 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
16420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16430 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
16440 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
16450 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
16460 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
16470 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
16480 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
16490 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( pColl==0 || c
164a0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43  ollationMatch(pC
164b0 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20  oll,pIndex) ){. 
164c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
164d0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
164e0 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d  pParse, 0, pTab-
164f0 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  >iDb);.      sql
16500 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
16510 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
16520 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
16530 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
16540 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
16550 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
16560 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
16570 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
16580 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
16590 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
165a0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
165b0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
165c0 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
165d0 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
165e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
165f0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
16600 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
16610 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
16620 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
16630 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
16640 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
16650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16660 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
16670 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16690 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
166a0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
166b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
166c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
166d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
166e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
166f0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
16700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16710 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
16720 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
16730 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16750 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
16760 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
16770 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
16780 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
16790 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
167a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d  +){.    if( pDb=
167b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
167c0 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
167d0 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74  ashFirst(&pDb->t
167e0 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
167f0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
16800 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
16810 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
16820 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
16830 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
16840 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f 6c  arse, pTab, pCol
16850 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
16860 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
16870 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
16880 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
16890 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
168a0 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
168d0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
168e0 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
168f0 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
16900 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
16910 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
16920 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
16930 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
16940 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
16950 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
16960 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
16970 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
16980 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
16990 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
169a0 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
169b0 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
169c0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
169d0 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
169e0 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
169f0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
16a00 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
16a10 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
16a20 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
16a30 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
16a40 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
16a50 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
16a60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16a70 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
16a80 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
16a90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
16aa0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
16ab0 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
16ac0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16ae0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
16af0 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
16b00 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
16b10 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
16b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16b30 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
16b40 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
16b50 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
16b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
16b70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16b80 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
16b90 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16ba0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
16bb0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
16bc0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16be0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
16bf0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
16c00 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
16c30 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
16c40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
16c50 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
16c60 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
16c70 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
16c80 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
16c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16ca0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
16cb0 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
16cc0 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
16cd0 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
16ce0 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
16cf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
16d00 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
16d10 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
16d20 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
16d30 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
16d40 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
16d50 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
16d60 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
16d70 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16d80 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
16d90 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30   || pName1->z==0
16da0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
16db0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
16dc0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
16dd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61  .  }else if( pNa
16de0 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32  me2==0 || pName2
16df0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  ->z==0 ){.    pC
16e00 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
16e10 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d  dCollSeq(db, db-
16e20 3e 65 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c  >enc, pName1->z,
16e30 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a   pName1->n, 0);.
16e40 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
16e50 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61  .      reindexDa
16e60 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
16e70 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  pColl);.      re
16e80 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
16e90 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
16ea0 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
16eb0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
16ec0 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  2, &pObjName);. 
16ed0 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
16ee0 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
16ef0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
16f00 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62  pObjName);.  zDb
16f10 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
16f20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  zName;.  pTab = 
16f30 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
16f40 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
16f50 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
16f60 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
16f70 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
16f80 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
16f90 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
16fa0 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
16fb0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
16fc0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
16fd0 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66  iteFree(z);.  if
16fe0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
16ff0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
17000 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
17010 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
17020 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
17030 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
17040 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
17050 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
17060 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17070 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
17080 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
17090 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
170a0 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a           ");.}.#endif.