/ Hex Artifact Content
Login

Artifact 4b6f9e61159733f86cd1589f4c10834ba856d280:


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 33 37 20 32 30 30 35 2f 30 37 2f 32 37  1.337 2005/07/27
02f0: 20 32 30 3a 34 31 3a 34 34 20 64 72 68 20 45 78   20:41:44 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 20 20 20 20 2f 2a 20  ;.    }..    /* 
0a80: 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74  Add a No-op that
0a90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
0aa0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
0ab0: 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a  he compiled SQL.
0ac0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
0ad0: 20 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d   as its P3 argum
0ae0: 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20  ent.  This does 
0af0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66  not change the f
0b00: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
0b10: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
0b20: 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  am. .    **.    
0b30: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
0b40: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  to implement sql
0b50: 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20  ite3_trace()..  
0b60: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
0b70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  VdbeOp3(v, OP_No
0b80: 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65  op, 0, 0, pParse
0b90: 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e  ->zSql, pParse->
0ba0: 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53  zTail-pParse->zS
0bb0: 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ql);.  }...  /* 
0bc0: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
0bd0: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
0be0: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
0bf0: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0c00: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
0c10: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
0c20: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0c30: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
0c40: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
0c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
0c60: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
0c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
0c80: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
0c90: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
0ca0: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
0cd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70   pParse->nMaxDep
0ce0: 74 68 2b 31 2c 20 70 50 61 72 73 65 2d 3e 65 78  th+1, pParse->ex
0cf0: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
0d00: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d10: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
0d20: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
0d30: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
0d40: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
0d60: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61  ERROR;.  }.  pPa
0d80: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  rse->nTab = 0;. 
0d90: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
0da0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  0;.  pParse->nSe
0db0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  t = 0;.  pParse-
0dc0: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61  >nVar = 0;.  pPa
0dd0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
0de0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
0df0: 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d  ookieGoto = 0;.}
0e00: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
0e10: 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20  parser and code 
0e20: 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73  generator recurs
0e30: 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ively in order t
0e40: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  o generate.** co
0e50: 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73  de for the SQL s
0e60: 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f  tatement given o
0e70: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
0e80: 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78  he pParse contex
0e90: 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  t.** currently u
0ea0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
0eb0: 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72  n.  When the par
0ec0: 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72  ser is run recur
0ed0: 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77  sively.** this w
0ee0: 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50  ay, the final OP
0ef0: 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70  _Halt is not app
0f00: 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20  ended and other 
0f10: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a  initialization.*
0f20: 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69  * and finalizati
0f30: 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69  on steps are omi
0f40: 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f  tted because tho
0f50: 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20  se are handling 
0f60: 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d  by the.** outerm
0f70: 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a  ost parser..**.*
0f80: 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67  * Not everything
0f90: 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54   is nestable.  T
0fa0: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0fb0: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d  designed to perm
0fc0: 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  it.** INSERT, UP
0fd0: 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
0fe0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69   operations agai
0ff0: 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  nst SQLITE_MASTE
1000: 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20  R.  Use.** care 
1010: 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f  if you decide to
1020: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73   try to use this
1030: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d   routine for som
1040: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73  e other purposes
1050: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1060: 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72  3NestedParse(Par
1070: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1080: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1090: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
10a0: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
10b0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 20 64  l;.  int rc;.# d
10c0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
10d0: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
10e0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
10f0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1100: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1110: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1120: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1130: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1140: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1150: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1160: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1170: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1180: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1190: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
11a0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
11b0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
11c0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
11d0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
11e0: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
11f0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1200: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1210: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1220: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1230: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1240: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1250: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1260: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1270: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
1280: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1290: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
12a0: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
12b0: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
12c0: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
12d0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
12e0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
12f0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1300: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1310: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1320: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1330: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1340: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1350: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1360: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1370: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1380: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1390: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
13a0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
13b0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
13c0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
13d0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
13e0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
13f0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
1400: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
1410: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1420: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1430: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1440: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1450: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1460: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1470: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1480: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1490: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
14a0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
14b0: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
14c0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
14d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
14e0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14f0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
1500: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
1510: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1520: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1530: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1540: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1550: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1560: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1570: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1580: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1590: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
15a0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
15b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
15c0: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
15d0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
15e0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
15f0: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
1600: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
1610: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
1620: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
1630: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1640: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
1650: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
1660: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
1670: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
1680: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61  db->aDb[j].tblHa
1690: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
16a0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
16b0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
16c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
16d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
16e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
16f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1700: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1710: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1720: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1730: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1740: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1750: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1760: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1770: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1780: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1790: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
17a0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
17b0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
17c0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
17d0: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
17e0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
17f0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1800: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
1810: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
1820: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
1830: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
1840: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1850: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
1860: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
1870: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
1880: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
1890: 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73  LocateTable(Pars
18a0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
18b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
18c0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
18d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
18e0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
18f0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1900: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1910: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1920: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1930: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1940: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1950: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1960: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1970: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1980: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1990: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
19a0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
19b0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
19c0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
19d0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
19e0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
19f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a00: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a10: 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20   table: %s.%s", 
1a20: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
1a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1a40: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
1a50: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
1a60: 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1a70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a80: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1a90: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e  \"%s\" is not in
1aa0: 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1ab0: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
1ac0: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20  e, zDbase);.    
1ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1ae0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1af0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1b00: 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ble: %s", zName)
1b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1b20: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1b30: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
1b40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
1b50: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1b60: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1b70: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
1b80: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
1b90: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
1ba0: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
1bb0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
1bc0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1bd0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1be0: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
1bf0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1c00: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1c10: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1c20: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1c30: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1c40: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
1c50: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
1c60: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
1c70: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1c80: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
1c90: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
1ca0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1cb0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
1cc0: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
1cd0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
1ce0: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
1cf0: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
1d00: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
1d10: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
1d20: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
1d30: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
1d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1d50: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1d60: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
1d70: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1d80: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1d90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
1da0: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
1db0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1dc0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
1dd0: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
1de0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
1df0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1e00: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
1e10: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1e20: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
1e30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1e40: 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  b, db->aDb[j].zN
1e50: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1e60: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1e70: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1e80: 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e  b[j].idxHash, zN
1e90: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1ea0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1ec0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1ed0: 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  ** Reclaim the m
1ee0: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e  emory used by an
1ef0: 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63   index.*/.static
1f00: 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28   void freeIndex(
1f10: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c  Index *p){.  sql
1f20: 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41  iteFree(p->zColA
1f30: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ff);.  sqliteFre
1f40: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  e(p);.}../*.** R
1f50: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
1f60: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
1f70: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
1f80: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
1f90: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
1fa0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
1fb0: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
1fc0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1fd0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74   hash tables but
1fe0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e  .** it is not un
1ff0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
2000: 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e  Table that it in
2010: 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b  dexes..** Unlink
2020: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ing from the Tab
2030: 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  le must be done 
2040: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
2050: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2060: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65  ic void sqliteDe
2070: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
2080: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  3 *db, Index *p)
2090: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
20a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
20b0: 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30  0 && p->zName!=0
20c0: 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c   );.  pOld = sql
20d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
20e0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
20f0: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
2100: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2120: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
2130: 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21   0);.  if( pOld!
2140: 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b  =0 && pOld!=p ){
2150: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2160: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2170: 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  p->iDb].idxHash,
2180: 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pOld->zName,.  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e     strlen(pOld->
21b0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
21c0: 0a 20 20 7d 0a 20 20 66 72 65 65 49 6e 64 65 78  .  }.  freeIndex
21d0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  (p);.}../*.** Fo
21e0: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
21f0: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
2200: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
2210: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
2220: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
2230: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
2240: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
2250: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
2260: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
2270: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
2280: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
2290: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
22a0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
22b0: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
22c0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
22d0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
22e0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
22f0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
2300: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
2310: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  ndex;.  int len;
2320: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
2330: 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49  (zIdxName);.  pI
2340: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61  ndex = sqlite3Ha
2350: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2360: 62 5b 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  b[iDb].idxHash, 
2370: 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c  zIdxName, len+1,
2380: 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   0);.  if( pInde
2390: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  x ){.    if( pIn
23a0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
23b0: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
23c0: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61       pIndex->pTa
23d0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  ble->pIndex = pI
23e0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
23f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
2400: 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  dex *p;.      fo
2410: 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  r(p=pIndex->pTab
2420: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  le->pIndex; p &&
2430: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
2440: 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  x; p=p->pNext){}
2450: 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20  .      if( p && 
2460: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
2470: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
2480: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
2490: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
24a0: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
24b0: 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
24c0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
24d0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
24e0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  es;.}../*.** Era
24f0: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
2500: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2510: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
2520: 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61  h tables of.** a
2530: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2540: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2550: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
2560: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
2570: 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  efore the databa
2580: 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69  se closes.  It i
2590: 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75  s also called du
25a0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ring a rollback.
25b0: 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ** if there were
25c0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
25d0: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
25e0: 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a  action or if a.*
25f0: 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  * schema-cookie 
2600: 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e  mismatch occurs.
2610: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30  .**.** If iDb<=0
2620: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
2630: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
2640: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
2650: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
2660: 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65  .  If iDb>=2 the
2670: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
2680: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
2690: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
26a0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
26b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26c0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
26d0: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
26e0: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48  b, int iDb){.  H
26f0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
2700: 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20    Hash temp1;.  
2710: 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e  Hash temp2;.  in
2720: 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72  t i, j;..  asser
2730: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
2740: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62  <db->nDb );.  db
2750: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2760: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a  TE_Initialized;.
2770: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
27a0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d  >aDb[i];.    tem
27b0: 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73  p1 = pDb->tblHas
27c0: 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70  h;.    temp2 = p
27d0: 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20  Db->trigHash;.  
27e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
27f0: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
2800: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2810: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
2820: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2830: 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20  pDb->aFKey);.   
2840: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2850: 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  r(&pDb->idxHash)
2860: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
2870: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2880: 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20  &temp2); pElem; 
2890: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
28a0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
28b0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
28c0: 65 54 72 69 67 67 65 72 28 28 54 72 69 67 67 65  eTrigger((Trigge
28d0: 72 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  r*)sqliteHashDat
28e0: 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d  a(pElem));.    }
28f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2900: 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20  Clear(&temp2);. 
2910: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
2920: 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  it(&pDb->tblHash
2930: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2940: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f  RING, 0);.    fo
2950: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
2960: 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b  shFirst(&temp1);
2970: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
2980: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
2990: 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  em)){.      Tabl
29a0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
29b0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
29c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
29d0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
29e0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
29f0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
2a00: 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 70 44 62  &temp1);.    pDb
2a10: 2d 3e 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20  ->pSeqTab = 0;. 
2a20: 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72     DbClearProper
2a30: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68  ty(db, i, DB_Sch
2a40: 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20  emaLoaded);.    
2a50: 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75  if( iDb>0 ) retu
2a60: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
2a70: 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62  ( iDb==0 );.  db
2a80: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2a90: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2aa0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
2ab0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
2ac0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2ad0: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
2ae0: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
2af0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72  n remove then fr
2b00: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
2b10: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
2b20: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
2b30: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
2b40: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
2b50: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
2b60: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
2b70: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
2b80: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2b90: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
2ba0: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
2bb0: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
2bc0: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
2bd0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
2be0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
2bf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2c00: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2c10: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2c20: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2c30: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
2c40: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
2c50: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
2c60: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
2c70: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
2c80: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
2c90: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
2ca0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2cb0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2cc0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2cd0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2ce0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
2cf0: 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e  liteFree(pDb->zN
2d00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
2d10: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
2d20: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d30: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
2d40: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
2d50: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
2d60: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
2d70: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
2d80: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
2d90: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
2da0: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
2db0: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
2dc0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
2dd0: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
2de0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
2df0: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
2e00: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
2e10: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
2e20: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ));.    sqliteFr
2e30: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
2e40: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
2e50: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
2e60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2e70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2e80: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
2e90: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
2ea0: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
2eb0: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
2ec0: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2ed0: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
2ee0: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
2ef0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
2f00: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
2f10: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
2f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2f30: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2f40: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
2f50: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
2f60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2f70: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
2f80: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
2f90: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
2fa0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
2fb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2fc0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
2fd0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
2fe0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2ff0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3000: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3010: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3020: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3030: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3040: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
3050: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20  mn names from a 
3060: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a  table or view..*
3070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3080: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3090: 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62  ames(Table *pTab
30a0: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
30b0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
30c0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
30d0: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
30e0: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
30f0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
3100: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
3110: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
3120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
3130: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
3140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3150: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
3160: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3170: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
3180: 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ype);.    }.    
3190: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
31a0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e->aCol);.  }.  
31b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
31c0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
31d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
31e0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
31f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
3200: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3210: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
3220: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
3230: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
3240: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
3250: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
3260: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
3270: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
3280: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
3290: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
32a0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
32b0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
32c0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72  hash table.  Nor
32d0: 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a   does it remove.
32e0: 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ** foreign keys 
32f0: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e  from the sqlite.
3300: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3310: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
3320: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
3330: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
3340: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
3350: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3360: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
3370: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
3380: 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   Indices associa
3390: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
33a0: 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20  le are unlinked 
33b0: 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a  from the "db".**
33c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
33d0: 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66  if db!=NULL.  If
33e0: 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63   db==NULL, indic
33f0: 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a  es attached to.*
3400: 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  * the table are 
3410: 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20  deleted, but it 
3420: 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20  is assumed they 
3430: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3440: 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  n.** unlinked..*
3450: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3460: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
3470: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
3480: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
3490: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
34a0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
34b0: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
34c0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
34d0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  turn;..  /* Do n
34e0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
34f0: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3500: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3510: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3520: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3530: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3540: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3550: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3560: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3570: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3580: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3590: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
35a0: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
35b0: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
35c0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
35d0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
35e0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
35f0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3600: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3610: 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  ex->iDb==pTable-
3620: 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d  >iDb || (pTable-
3630: 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65  >iDb==0 && pInde
3640: 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20  x->iDb==1) );.  
3650: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
3660: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3670: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3680: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3690: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
36a0: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
36b0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
36c0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
36d0: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
36e0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
36f0: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3700: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b  from the db->aFK
3710: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
3720: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
3730: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
3740: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
3750: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
3760: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
3770: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
3780: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44  sert( pTable->iD
3790: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
37a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37b0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
37c0: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61  b[pTable->iDb].a
37d0: 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  FKey,.          
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72   pFKey->zTo, str
3800: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
3810: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
3820: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
3830: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3840: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3850: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3860: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3870: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3880: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3890: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
38a0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
38b0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
38c0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
38d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
38e0: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3900: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3910: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3920: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
3930: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
3940: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
3950: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
3960: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
3970: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3980: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3990: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
39a0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
39b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
39c0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
39d0: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
39e0: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
39f0: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
3a00: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
3a10: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
3a20: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3a30: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
3a40: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
3a50: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
3a60: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
3a70: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
3a80: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3a90: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
3aa0: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3ab0: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29  (zTabName)+1, 0)
3ac0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
3ad0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3ae0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3af0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
3b00: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
3b10: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
3b20: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
3b30: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
3b40: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
3b50: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
3b60: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  pDb->aFKey, pF1-
3b70: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3b80: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
3b90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3ba0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3bb0: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3bc0: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3bd0: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
3be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
3bf0: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3c00: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3c10: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3c20: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3c30: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
3c40: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
3c50: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
3c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3c70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3c80: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3c90: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20  le(db, p);.  }. 
3ca0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
3cb0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3cc0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
3cd0: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
3ce0: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
3cf0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
3d00: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
3d10: 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20   token with any 
3d20: 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76  quotations remov
3d30: 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ed.  Space to ho
3d40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
3d50: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
3d60: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3d70: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
3d80: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
3d90: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
3da0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nction..**.** To
3db0: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
3dc0: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
3dd0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
3de0: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
3df0: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
3e00: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
3e10: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
3e20: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
3e30: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
3e40: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
3e50: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
3e60: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
3e70: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f  NameFromToken(To
3e80: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
3e90: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
3ea0: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
3eb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3ec0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
3ed0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
3ee0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3ef0: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3f00: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
3f10: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
3f30: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
3f40: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
3f50: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
3f60: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
3f70: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
3f80: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
3f90: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
3fa0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
3fb0: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
3fc0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
3fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3fe0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
3ff0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
4000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4010: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
4020: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
4030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4040: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
4050: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
4060: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
4070: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
4080: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
4090: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
40a0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
40b0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
40c0: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
40d0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
40e0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
40f0: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4100: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4110: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4120: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4130: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4140: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4150: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
4160: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4170: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
4180: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
4190: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
41a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
41b0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
41c0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
41d0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
41e0: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
41f0: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4200: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4210: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4220: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4230: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
4240: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
4250: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
4260: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
4270: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
4280: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
4290: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
42a0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e     n = strlen(zN
42b0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
42c0: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
42d0: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
42e0: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
42f0: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4300: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4310: 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28   ) && n==strlen(
4320: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
4330: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
4340: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
4350: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
4360: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4380: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4390: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
43a0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
43b0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
43c0: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
43d0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
43e0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
43f0: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4400: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4410: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4420: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4430: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4440: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4450: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
4460: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
4470: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4480: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4490: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
44a0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
44b0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
44c0: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
44d0: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
44e0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
44f0: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4500: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4510: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4520: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4540: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
4550: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
4560: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
4570: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
4580: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
4590: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
45a0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
45b0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
45c0: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
45d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
45e0: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
45f0: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4600: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4610: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4620: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4630: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4640: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
4650: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
4660: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4670: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
4680: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
4690: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
46a0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
46b0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
46c0: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
46d0: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
46e0: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
46f0: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
4700: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4720: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
4730: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
4740: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4750: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
4760: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
4770: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
4780: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
4790: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
47a0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
47b0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
47c0: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
47d0: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
47e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
47f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4800: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
4810: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
4820: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
4830: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4840: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4860: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
4870: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
4880: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
4890: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
48a0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
48b0: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
48c0: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
48d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
48e0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
48f0: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
4900: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
4910: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
4920: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
4930: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
4940: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
4950: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
4960: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
4970: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
4980: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
4990: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
49a0: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
49b0: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
49c0: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
49d0: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
49e0: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
49f0: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
4a00: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
4a10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
4a20: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
4a30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
4a40: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4a50: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4a60: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
4a70: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
4a80: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
4a90: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
4aa0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
4ab0: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
4ac0: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
4ad0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
4ae0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
4af0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4b00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4b10: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
4b20: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4b30: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
4b40: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4b50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4b60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4b70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4b80: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
4b90: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
4ba0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
4bb0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
4bc0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
4bd0: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
4be0: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
4bf0: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
4c00: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
4c10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4c20: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
4c30: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
4c40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
4c50: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
4c60: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
4c70: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
4c80: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4c90: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
4ca0: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
4cb0: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
4cc0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4cd0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
4ce0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
4cf0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
4d00: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
4d10: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
4d20: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
4d30: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
4d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
4d50: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
4d60: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
4d70: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
4d80: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
4d90: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
4da0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
4db0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
4dc0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
4dd0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
4de0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
4df0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4e00: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
4e10: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4e20: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
4e30: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
4e40: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
4e50: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
4e60: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
4e70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
4e80: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
4e90: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4ea0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4eb0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
4ec0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
4ed0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
4ee0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
4ef0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
4f00: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4f10: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
4f20: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
4f30: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
4f40: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
4f50: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4f60: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
4f70: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
4f80: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
4f90: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
4fa0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
4fb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4fc0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
4fd0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
4fe0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
4ff0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
5000: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5010: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
5020: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
5030: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
5040: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
5050: 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20  isView       /* 
5060: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
5070: 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54  a VIEW */.){.  T
5080: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
5090: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
50a0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
50b0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
50c0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
50d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
50e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
50f0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
5100: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
5110: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
5120: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
5130: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
5140: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
5150: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
5160: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
5170: 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eate */..  /* Th
5180: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5190: 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69  name to create i
51a0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
51b0: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
51c0: 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20  ens.  ** pName1 
51d0: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
51e0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
51f0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5200: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5210: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
5220: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5230: 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ...);.  ** .  **
5240: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5250: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5260: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5270: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
5280: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62   if.  ** the tab
5290: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
52a0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
52b0: 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  i.e.:.  **.  ** 
52c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
52d0: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  (...);.  **.  **
52e0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
52f0: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
5300: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20   pName2 is "".. 
5310: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
5320: 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65  l below sets the
5330: 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74   pName pointer t
5340: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5350: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5360: 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61    ** pName2) tha
5370: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
5380: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
5390: 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ame. The variabl
53a0: 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65  e iDb is.  ** se
53b0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
53c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
53d0: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72  hat the table or
53e0: 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20   view is to be. 
53f0: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a   ** created in..
5400: 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
5410: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
5420: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
5430: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
5440: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
5450: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d  eturn;.  if( !OM
5460: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5470: 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a  emp && iDb>1 ){.
5480: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
5490: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
54a0: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
54b0: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a  t be qualified *
54c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
54d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
54e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
54f0: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
5500: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
5510: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
5520: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5530: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
5540: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
5550: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
5560: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
5570: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
5580: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
5590: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
55a0: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
55b0: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
55c0: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
55d0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
55e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
55f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
5600: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
5610: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
5620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5630: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5640: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
5650: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
5660: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
5670: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
5680: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
5690: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
56a0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
56b0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
56c0: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
56d0: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
56e0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
56f0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5700: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
5710: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
5720: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
5730: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5740: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
5750: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5760: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
5770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5780: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5790: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
57a0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
57b0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
57c0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
57d0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
57e0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
57f0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
5800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5810: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5820: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
5830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5840: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5850: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
5860: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
5870: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
5880: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5890: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
58a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
58b0: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
58c0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
58d0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
58e0: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
58f0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
5900: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
5910: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
5920: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5930: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
5940: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
5950: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
5960: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
5970: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5980: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5990: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
59a0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
59b0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
59c0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
59d0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
59e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
59f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
5a00: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
5a10: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
5a20: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5a30: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5a40: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
5a50: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
5a60: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
5a70: 20 26 26 20 0a 20 20 20 20 20 20 28 20 69 44 62   && .      ( iDb
5a80: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
5a90: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71  .busy) ){.    sq
5aa0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5ab0: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
5ac0: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
5ad0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
5ae0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  e);.    goto beg
5af0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5b00: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
5b10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5b20: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
5b30: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
5b40: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
5b50: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5b60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5b70: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
5b80: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5b90: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
5ba0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
5bb0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
5bc0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
5bd0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
5be0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
5bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  ble->pIndex = 0;
5c00: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d  .  pTable->iDb =
5c10: 20 69 44 62 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   iDb;.  pTable->
5c20: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  nRef = 1;.  if( 
5c30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5c40: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
5c50: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
5c60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
5c70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5c80: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
5c90: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
5ca0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
5cb0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
5cc0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
5cd0: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
5ce0: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
5cf0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
5d00: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5d10: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
5d20: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
5d30: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
5d40: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
5d50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5d60: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
5d70: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
5d80: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
5d90: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5da0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
5db0: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  ){.    db->aDb[i
5dc0: 44 62 5d 2e 70 53 65 71 54 61 62 20 3d 20 70 54  Db].pSeqTab = pT
5dd0: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
5de0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
5df0: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
5e00: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
5e10: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
5e20: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
5e30: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
5e40: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
5e50: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
5e60: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
5e70: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
5e80: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
5e90: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
5ea0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
5eb0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
5ec0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
5ed0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
5ee0: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
5ef0: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
5f00: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
5f10: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
5f20: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
5f30: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
5f40: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
5f50: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
5f60: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
5f70: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5f80: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
5f90: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
5fa0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
5fb0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
5fc0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5fd0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
5fe0: 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 73 71 6c  int lbl;.    sql
5ff0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6000: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
6010: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
6020: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
6030: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
6040: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
6050: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
6060: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
6070: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6080: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6090: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
60a0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
60b0: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
60c0: 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73  t */.    lbl = s
60d0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
60e0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
60f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6100: 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a  OP_If, 0, lbl);.
6110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6120: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6130: 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  er, db->file_for
6140: 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
6150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6160: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
6170: 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 1);.    sqli
6180: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6190: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
61a0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  enc, 0);.    sql
61b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
61c0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
61d0: 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 4);.    sqli
61e0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
61f0: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20  bel(v, lbl);..  
6200: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
6210: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
6220: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
6230: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6240: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
6250: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
6260: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
6270: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
6280: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
6290: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
62a0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
62b0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
62c0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
62d0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
62e0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
62f0: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6300: 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  y is left on the
6310: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
6320: 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  k..    ** The ro
6330: 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65  wid value is nee
6340: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
6350: 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  that sqlite3EndT
6360: 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  able will.    **
6370: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
6380: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6390: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69  _OMIT_VIEW.    i
63a0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
63b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
63c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
63d0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, 0, 0);.    }e
63e0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
63f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
6410: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
6420: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6430: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6440: 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  able(v, iDb);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
6470: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  d, 0, 0);.    sq
6480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6490: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
64a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
64b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
64c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
64d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
64e0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 30   OP_Insert, 0, 0
64f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6510: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
6520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6530: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
6540: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  0);.  }..  /* No
6550: 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29  rmal (non-error)
6560: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65   return. */.  re
6570: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  turn;..  /* If a
6580: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6590: 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a  we jump here */.
65a0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
65b0: 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  r:.  sqliteFree(
65c0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
65d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
65e0: 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
65f0: 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72   compare two str
6600: 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69  ings in a case-i
6610: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65  nsensitive manne
6620: 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67  r..** It is slig
6630: 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
6640: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
6650: 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74  StrICmp() direct
6660: 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75  ly, but.** produ
6670: 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e  ces larger code.
6680: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
6690: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f  This macro is no
66a0: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
66b0: 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66  h the strcmp() f
66c0: 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74  amily. It.** ret
66d0: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
66e0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65   two strings are
66f0: 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73   equal, otherwis
6700: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66  e false..*/.#def
6710: 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79  ine STRICMP(x, y
6720: 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65  ) (\.sqlite3Uppe
6730: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
6740: 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d  ned char *)(x)]=
6750: 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70  =   \.sqlite3Upp
6760: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
6770: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d  gned char *)(y)]
6780: 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65       \.&& sqlite
6790: 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28  3StrICmp((x)+1,(
67a0: 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a  y)+1)==0 )../*.*
67b0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
67c0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
67d0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
67e0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
67f0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
6800: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
6810: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
6820: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
6830: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
6840: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6850: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
6860: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
6870: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
6880: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
6890: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
68a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
68b0: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
68c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
68d0: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
68e0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
68f0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
6900: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
6910: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
6920: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
6930: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
6940: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
6950: 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
6960: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
6970: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
6980: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
6990: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
69a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
69b0: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
69c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
69d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
69e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
69f0: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
6a00: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
6a10: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6a20: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
6a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
6a40: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
6a50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
6a60: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
6a70: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
6a80: 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d  oc( p->aCol, (p-
6a90: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
6aa0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6ab0: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
6ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6ad0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
6ae0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
6af0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
6b00: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
6b10: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
6b20: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
6b30: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
6b40: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
6b50: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
6b60: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
6b70: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
6b80: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
6b90: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
6ba0: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
6bb0: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
6bc0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
6bd0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
6be0: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
6bf0: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
6c00: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
6c10: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
6c20: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
6c30: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
6c40: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c  AFF_NONE;.  pCol
6c50: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ->pColl = pParse
6c60: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
6c70: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
6c80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6c90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
6ca0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
6cb0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
6cc0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
6cd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6ce0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
6cf0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
6d00: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
6d10: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
6d20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
6d30: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
6d40: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
6d50: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
6d60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
6d70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6d80: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
6d90: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
6da0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
6db0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
6dc0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6dd0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6de0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
6df0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
6e00: 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69  i>=0 ) p->aCol[i
6e10: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  ].notNull = onEr
6e20: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
6e30: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
6e40: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
6e50: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
6e60: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
6e70: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
6e80: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
6e90: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
6ea0: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
6eb0: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
6ec0: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
6ed0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
6ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
6ef0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
6f00: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
6f10: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
6f20: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
6f30: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
6f40: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
6f50: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
6f60: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
6f70: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
6f80: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
6f90: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
6fa0: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
6fb0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
6fc0: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
6fd0: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
6fe0: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
6ff0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
7000: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
7010: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
7040: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
7050: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
7060: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
7070: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7080: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
7090: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
70a0: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
70b0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
70c0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
70d0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
70e0: 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 0a 2a 2a  E_AFF_NONE.**.**
70f0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
7100: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7110: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
7120: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
7130: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
7140: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
7150: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
7160: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f  ityType(const To
7170: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75  ken *pType){.  u
7180: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
7190: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
71a0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
71b0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
71c0: 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a   *zIn = pType->z
71d0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
71e0: 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20  ed char *zEnd = 
71f0: 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d  &pType->z[pType-
7200: 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a  >n];..  while( z
7210: 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20  In!=zEnd ){.    
7220: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
7230: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7240: 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b  [*zIn];.    zIn+
7250: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
7260: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
7270: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
7280: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
7290: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
72a0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
72b0: 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c  F_TEXT; .    }el
72c0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
72d0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
72e0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
72f0: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
7300: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7310: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
7320: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7330: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
7340: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
7350: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
7360: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
7370: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7380: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
7390: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
73a0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
73b0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
73c0: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
73d0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
73e0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
73f0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7400: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
7410: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
7420: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
7430: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
7440: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
7450: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7460: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7470: 47 45 52 3b 20 0a 20 20 20 20 20 20 62 72 65 61  GER; .      brea
7480: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
7490: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
74a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
74b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
74c0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
74d0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
74e0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
74f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
7500: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
7510: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
7520: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
7530: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
7540: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
7550: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
7560: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
7570: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
7580: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
7590: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
75a0: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
75b0: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
75c0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
75d0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
75e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
75f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
7600: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
7610: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
7620: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
7630: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
7640: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
7650: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
7660: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
7670: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7680: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
7690: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28   *pCol;..  if( (
76a0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
76b0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
76c0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
76d0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
76e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
76f0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
7700: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a   assert( pCol->z
7710: 54 79 70 65 3d 3d 30 20 29 3b 0a 23 69 66 20 30  Type==0 );.#if 0
7720: 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  .  z = pCol->zTy
7730: 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  pe = sqliteMallo
7740: 63 52 61 77 28 6e 2b 31 29 3b 0a 20 20 69 66 28  cRaw(n+1);.  if(
7750: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7760: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
7770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
7780: 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20 20 20  c = zIn[i];.    
7790: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
77a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
77b0: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  [j++] = c;.  }. 
77c0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 23 65 6e 64 69   z[j] = 0;.#endi
77d0: 66 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  f.  pCol->zType 
77e0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
77f0: 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20  mToken(pType);. 
7800: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7810: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
7820: 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a  yType(pType);.}.
7830: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
7840: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
7850: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
7860: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7870: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
7880: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
7890: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
78a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
78b0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
78c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
78d0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
78e0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
78f0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
7900: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
7910: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7920: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7930: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7940: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7950: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7960: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7970: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
7980: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
7990: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
79a0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
79b0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
79c0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
79d0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
79e0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
79f0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
7a00: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
7a10: 6f 6c 2d 31 5d 29 3b 0a 20 20 69 66 28 20 21 73  ol-1]);.  if( !s
7a20: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
7a30: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
7a40: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
7a50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a60: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
7a70: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
7a80: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
7a90: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 70 43 6f  nt",.        pCo
7aa0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  l->zName);.  }el
7ab0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
7ac0: 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e  xprDelete(pCol->
7ad0: 70 44 66 6c 74 29 3b 0a 20 20 20 20 70 43 6f 6c  pDflt);.    pCol
7ae0: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
7af0: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
7b00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
7b10: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
7b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
7b30: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
7b40: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
7b50: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
7b60: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
7b70: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
7b80: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
7b90: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
7ba0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
7bb0: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
7bc0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
7bd0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
7be0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
7bf0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
7c00: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
7c10: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
7c20: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
7c30: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
7c40: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
7c50: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
7c60: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
7c70: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
7c80: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
7c90: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
7ca0: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
7cb0: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
7cc0: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
7cd0: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
7ce0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
7cf0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
7d00: 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74  he rowid.  Set t
7d10: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
7d20: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
7d30: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
7d40: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
7d50: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
7d60: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
7d70: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
7d80: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
7d90: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
7da0: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
7db0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
7dc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
7dd0: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
7de0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
7df0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
7e00: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
7e10: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
7e20: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
7e30: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
7e40: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
7e50: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
7e60: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
7e70: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
7e80: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7e90: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
7ea0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
7eb0: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
7ec0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
7ed0: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
7ee0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
7ef0: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
7f00: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
7f10: 6e 74 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20  nt autoInc      
7f20: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
7f30: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
7f40: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
7f50: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
7f60: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
7f70: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
7f80: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
7f90: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
7fa0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
7fb0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
7fc0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
7fd0: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
7fe0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7ff0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8000: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
8010: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
8020: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
8030: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
8040: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
8050: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
8060: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
8070: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
8080: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
8090: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
80a0: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
80b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
80c0: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
80d0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
80e0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
80f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
8100: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
8110: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
8120: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
8130: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
8140: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
8150: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8160: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
8170: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8190: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
81a0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62  Tab->nCol ) pTab
81b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
81c0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  rimKey = 1;.    
81d0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
81e0: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
81f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
8200: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
8210: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
8220: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
8230: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
8240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
8250: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
8260: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
8270: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
8280: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
8290: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
82a0: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
82b0: 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49  .    pTab->autoI
82c0: 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20  nc = autoInc;.  
82d0: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
82e0: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
82f0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
8300: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
8310: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8320: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
8330: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
8340: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
8350: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
8360: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
8370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8380: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
8390: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
83a0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
83b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
83c0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
83d0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
83e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
83f0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
8400: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
8410: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
8420: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
8430: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8440: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
8450: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
8460: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
8470: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8480: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
8490: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
84a0: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
84b0: 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  t nType){.  Tabl
84c0: 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70  e *p;.  Index *p
84d0: 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Idx;.  CollSeq *
84e0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
84f0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8500: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8510: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
8520: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
8530: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
8540: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
8550: 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  rse, zType, nTyp
8560: 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e);.  p->aCol[i]
8570: 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  .pColl = pColl;.
8580: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c  .  /* If the col
8590: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
85a0: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
85b0: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
85c0: 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65  type>",.  ** the
85d0: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
85e0: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
85f0: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
8600: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20  before the.  ** 
8610: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
8620: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
8630: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
8640: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
8650: 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70   for(pIdx = p->p
8660: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
8670: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
8680: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
8690: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
86a0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
86b0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70  Column[0]==i ) p
86c0: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
86d0: 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[0] = pColl;. 
86e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c   }.}../*.** Call
86f0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
8700: 6c 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20 63  lSeq() for all c
8710: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8720: 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a  es in an index,.
8730: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76  ** in order to v
8740: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 74  erify that all t
8750: 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6c  he necessary col
8760: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
8770: 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a   are.** loaded..
8780: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
8790: 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28  eckIndexCollSeq(
87a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
87b0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
87c0: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69  f( pIdx ){.    i
87d0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
87e0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
87f0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
8800: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
8810: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
8820: 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
8830: 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  oll[i]) ){.     
8840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8850: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
8860: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8870: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8880: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
8890: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
88a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
88b0: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
88c0: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
88d0: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
88e0: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
88f0: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
8900: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
8910: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
8920: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8930: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
8940: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
8950: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
8960: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
8970: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
8980: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
8990: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
89a0: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
89b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
89c0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
89d0: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
89e0: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
89f0: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
8a00: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
8a10: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
8a20: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
8a30: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
8a40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
8a50: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
8a60: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
8a70: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
8a80: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
8a90: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
8aa0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
8ab0: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
8ac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
8ad0: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
8ae0: 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  rse..*/.CollSeq 
8af0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
8b00: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
8b10: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
8b20: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
8b30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
8b40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8b50: 20 20 75 38 20 65 6e 63 20 3d 20 64 62 2d 3e 65    u8 enc = db->e
8b60: 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  nc;.  u8 initbus
8b70: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
8b80: 79 3b 0a 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  y;..  CollSeq *p
8b90: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
8ba0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
8bb0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
8bc0: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
8bd0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
8be0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
8bf0: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
8c00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
8c10: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f  tCollSeq(db, pCo
8c20: 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ll, zName, nName
8c30: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
8c40: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  l ){.      if( n
8c50: 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Name<0 ){.      
8c60: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
8c70: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  (zName);.      }
8c80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8c90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8ca0: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
8cb0: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73  n sequence: %.*s
8cc0: 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  ", nName, zName)
8cd0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
8ce0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
8cf0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
8d00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8d10: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8d20: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
8d30: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
8d40: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
8d50: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
8d60: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
8d70: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
8d80: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
8d90: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
8da0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
8db0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
8dc0: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
8dd0: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
8de0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
8df0: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
8e00: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
8e10: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
8e20: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
8e30: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
8e40: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
8e50: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
8e60: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
8e70: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
8e80: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
8e90: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
8ea0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
8eb0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
8ec0: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
8ed0: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
8ee0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
8ef0: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
8f00: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
8f10: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
8f20: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
8f30: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
8f40: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
8f50: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
8f60: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
8f70: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
8f80: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
8f90: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
8fa0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
8fb0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
8fc0: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
8fd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
8fe0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
8ff0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76  te3 *db, Vdbe *v
9000: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
9010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9020: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
9030: 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
9040: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a  a_cookie+1, 0);.
9050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9060: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
9070: 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a  ie, iDb, 0);.}..
9080: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
9090: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
90a0: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
90b0: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
90c0: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
90d0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
90e0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
90f0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
9100: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
9110: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
9120: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
9130: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
9140: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
9150: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
9160: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
9170: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
9180: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9190: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
91a0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
91b0: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
91c0: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
91d0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
91e0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
91f0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
9200: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
9210: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
9220: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
9230: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
9240: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
9250: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
9260: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9270: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
9280: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
9290: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
92a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
92b0: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
92c0: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
92d0: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
92e0: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
92f0: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20  .  i = *pIdx;.  
9300: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
9310: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
9320: 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  ( !isalnum(zIden
9330: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
9340: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
9350: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
9360: 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   =  zIdent[j]!=0
9370: 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65   || isdigit(zIde
9380: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
9390: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
93a0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
93b0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
93c0: 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ;.  if( needQuot
93d0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
93e0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
93f0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
9400: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
9410: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
9420: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
9430: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
9440: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9450: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9460: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
9470: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
9480: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
9490: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
94a0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
94b0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
94c0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
94d0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
94e0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
94f0: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
9500: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
9510: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
9520: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
9530: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
9540: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9550: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
9560: 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  (Table *p){.  in
9570: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
9580: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
9590: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
95a0: 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c  *zEnd, *z;.  Col
95b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
95c0: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
95d0: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
95e0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
95f0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
9600: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
9610: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a  l->zName);.    z
9620: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
9630: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
9640: 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28     n += (strlen(
9650: 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  z) + 1);.    }. 
9660: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
9670: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
9680: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20  .  if( n<50 ){. 
9690: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
96a0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
96b0: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
96c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
96d0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
96e0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
96f0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
9700: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
9710: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
9720: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
9730: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
9740: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
9750: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
9760: 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45  (zStmt, !OMIT_TE
9770: 4d 50 44 42 26 26 70 2d 3e 69 44 62 3d 3d 31 20  MPDB&&p->iDb==1 
9780: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
9790: 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54  ABLE ":"CREATE T
97a0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
97b0: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
97c0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
97d0: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
97e0: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
97f0: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
9800: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
9810: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
9820: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  ++){.    strcpy(
9830: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
9840: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
9850: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
9860: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
9870: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
9880: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
9890: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  ame);.    if( (z
98a0: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21   = pCol->zType)!
98b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  =0 ){.      zStm
98c0: 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  t[k++] = ' ';.  
98d0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
98e0: 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20  t[k], z);.      
98f0: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a  k += strlen(z);.
9900: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63      }.  }.  strc
9910: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
9920: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
9930: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
9940: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9950: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
9960: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
9970: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
9980: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9990: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
99a0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
99b0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
99c0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
99d0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
99e0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
99f0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
9a00: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
9a10: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
9a20: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
9a30: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
9a40: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
9a50: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
9a60: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
9a70: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
9a80: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
9a90: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
9aa0: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
9ab0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9ac0: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
9ad0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
9ae0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
9af0: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
9b00: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
9b10: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
9b20: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
9b30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
9b40: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
9b50: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
9b60: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
9b70: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
9b80: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
9b90: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
9ba0: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
9bb0: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
9bc0: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
9bd0: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
9be0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
9bf0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
9c00: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
9c10: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
9c20: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
9c30: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
9c40: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
9c50: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
9c60: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
9c70: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
9c80: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
9c90: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
9ca0: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
9cb0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9cc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9cd0: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
9ce0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9cf0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
9d00: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
9d10: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
9d20: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
9d30: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
9d40: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
9d50: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
9d60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9d70: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
9d80: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
9d90: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
9da0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
9db0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
9dc0: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
9dd0: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
9de0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9df0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9e00: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
9e10: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
9e20: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
9e30: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
9e40: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
9e50: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
9e60: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9e70: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
9e80: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
9e90: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
9ea0: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
9eb0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9ec0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
9ed0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
9ee0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9ef0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
9f00: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
9f10: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
9f20: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
9f30: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
9f40: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
9f50: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
9f60: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
9f70: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
9f80: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
9f90: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
9fa0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
9fb0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
9fc0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
9fd0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
9fe0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
9ff0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
a000: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
a010: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
a020: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
a030: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
a040: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
a050: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
a060: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
a070: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
a080: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
a090: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
a0a0: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
a0b0: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
a0c0: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
a0d0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
a0e0: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
a0f0: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
a100: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
a110: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
a120: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
a130: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
a140: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
a150: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
a160: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
a170: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
a180: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
a190: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
a1a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
a1b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
a1c0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
a1d0: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
a1e0: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
a1f0: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
a200: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
a210: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
a220: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
a230: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
a240: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
a250: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
a260: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
a270: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a280: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a290: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
a2a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a2b0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
a2c0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
a2d0: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
a2e0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
a2f0: 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20  nd push it onto 
a300: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
a310: 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20  * A view has no 
a320: 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73  rootpage, so jus
a330: 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e  t push a zero on
a340: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72  to the stack for
a350: 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20  .    ** views.  
a360: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
a370: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
a380: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
a390: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
a3a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
a3b0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
a3c0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
a3d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
a3e0: 72 65 61 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69  reateTable, p->i
a3f0: 44 62 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  Db, 0); */.     
a400: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
a410: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
a420: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
a430: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
a440: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
a450: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
a460: 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
a470: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a480: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20  Integer, 0, 0); 
a490: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
a4a0: 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
a4b0: 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
a4c0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
a4d0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
a4e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
a4f0: 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
a500: 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
a510: 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
a520: 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
a530: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
a540: 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
a550: 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
a560: 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
a570: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
a580: 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20  he vdbe stack.. 
a590: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
a5a0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
a5b0: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
a5c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
a5d0: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
a5e0: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
a5f0: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
a600: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
a610: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
a620: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
a630: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
a640: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
a650: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ect ){.      Tab
a660: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20  le *pSelTab;.   
a670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a680: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
a690: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a6b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69  OP_Integer, p->i
a6c0: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
a6d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a6e0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
a6f0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
a700: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
a710: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
a720: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
a730: 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  ct, SRT_Table, 1
a740: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
a750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a760: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
a770: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
a780: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
a790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
a7a0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
a7b0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
a7c0: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
a7d0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
a7e0: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
a7f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
a800: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
a810: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
a820: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
a830: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
a840: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
a850: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
a860: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
a870: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
a880: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
a890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
a8a0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
a8b0: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
a8c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
a8d0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
a8e0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
a8f0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
a900: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
a910: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
a920: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
a930: 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(p);.    }else{
a940: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d  .      n = pEnd-
a950: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
a960: 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20  meToken.z + 1;. 
a970: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
a980: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
a990: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
a9a0: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
a9b0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
a9c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
a9d0: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
a9e0: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
a9f0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
aa00: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
aa10: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
aa20: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
aa30: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
aa40: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
aa50: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
aa60: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
aa70: 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64  cted.  The rowid
aa80: 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f   for the preallo
aa90: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f  cated.    ** slo
aaa0: 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65  t is the 2nd ite
aab0: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
aac0: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
aad0: 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20  stack is the.   
aae0: 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f   ** root page fo
aaf0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
ab00: 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20  (or a 0 if this 
ab10: 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20  is a view)..    
ab20: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
ab30: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
ab40: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
ab50: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
ab60: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
ab70: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
ab80: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
ab90: 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  #0, sql=%Q ".   
aba0: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
abb0: 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  =#1",.      db->
abc0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  aDb[p->iDb].zNam
abd0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
abe0: 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  p->iDb),.      z
abf0: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
ac00: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
ac10: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Name,.      zStm
ac20: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
ac30: 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a  iteFree(zStmt);.
ac40: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
ac50: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70  eCookie(db, v, p
ac60: 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  ->iDb);..#ifndef
ac70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ac80: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
ac90: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
aca0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  f we need to cre
acb0: 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65  ate an sqlite_se
acc0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72  quence table for
acd0: 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20  .    ** keeping 
ace0: 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63  track of autoinc
acf0: 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20  rement keys..   
ad00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   */.    if( p->a
ad10: 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20  utoInc ){.      
ad20: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
ad30: 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20  Db[p->iDb];.    
ad40: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 65 71 54    if( pDb->pSeqT
ad50: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
ad60: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
ad70: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
ad80: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
ad90: 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
ada0: 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
adb0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
adc0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
add0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ade0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
adf0: 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
ae00: 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
ae10: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
ae20: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
ae30: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
ae40: 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
ae50: 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20  a, p->iDb, 0,.  
ae60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
ae70: 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27  intf("tbl_name='
ae80: 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20  %q'",p->zName), 
ae90: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P3_DYNAMIC);.  }
aea0: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
aeb0: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
aec0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
aed0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
aee0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
aef0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
af00: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
af10: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
af20: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
af30: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44 62 20  *pFKey; .    Db 
af40: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
af50: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c  p->iDb];.    pOl
af60: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
af70: 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48  nsert(&pDb->tblH
af80: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
af90: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
afa0: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
afb0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
afc0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
afd0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
afe0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
aff0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
b000: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
b010: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
b030: 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70  GN_KEY.    for(p
b040: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
b050: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
b060: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
b070: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
b080: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
b090: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
b0a0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
b0b0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
b0c0: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
b0d0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
b0e0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
b0f0: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
b100: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
b110: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
b120: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
b130: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
b140: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
b150: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
b160: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
b170: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
b180: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b190: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
b1a0: 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
b1b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b1c0: 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
b1d0: 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
b1e0: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
b1f0: 3d 3d 30 20 29 20 70 43 6f 6e 73 20 3d 20 70 45  ==0 ) pCons = pE
b200: 6e 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  nd;.      p->add
b210: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
b220: 20 28 70 43 6f 6e 73 2d 3e 7a 20 2d 20 70 50 61   (pCons->z - pPa
b230: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
b240: 7a 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  z);.    }.#endif
b250: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
b260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b270: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
b280: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
b290: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
b2a0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
b2b0: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
b2c0: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
b2d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b2e0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
b2f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
b300: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
b310: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
b320: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
b330: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
b340: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b350: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
b360: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
b370: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b380: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
b390: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
b3a0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b3b0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b3c0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
b3d0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
b3e0: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
b3f0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
b400: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
b410: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
b420: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
b430: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
b440: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
b450: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
b460: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
b470: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
b480: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
b490: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
b4a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20  Token *pName;.. 
b4b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
b4c0: 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
b4d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b4e0: 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
b4f0: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
b500: 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73  n views");.    s
b510: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
b520: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
b530: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
b540: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
b550: 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c  (pParse, pBegin,
b560: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
b570: 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70   isTemp, 1);.  p
b580: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b590: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
b5a0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
b5b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
b5c0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
b5d0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
b5e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
b5f0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
b600: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
b610: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
b620: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
b630: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
b640: 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20  p->iDb, "view", 
b650: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
b660: 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
b670: 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20  sFix, pSelect). 
b680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
b690: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
b6a0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
b6b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
b6c0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
b6d0: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
b6e0: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
b6f0: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
b700: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
b710: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
b720: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
b730: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
b740: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
b750: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
b760: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
b770: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
b780: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
b790: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
b7a0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
b7b0: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
b7c0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
b7d0: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
b7e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b7f0: 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  Dup(pSelect);.  
b800: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
b810: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
b820: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
b830: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
b840: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
b850: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
b860: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
b870: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
b880: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
b890: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
b8a0: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
b8b0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
b8c0: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
b8d0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
b8e0: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
b8f0: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
b900: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
b910: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
b920: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
b930: 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20  0;.  n = sEnd.z 
b940: 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  - pBegin->z;.  z
b950: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
b960: 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d  ed char*)pBegin-
b970: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
b980: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
b990: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   || isspace(z[n-
b9a0: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
b9b0: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
b9c0: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
b9d0: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
b9e0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
b9f0: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
ba00: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
ba10: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
ba20: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
ba30: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
ba40: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
ba50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ba60: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
ba70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ba80: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
ba90: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
baa0: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
bab0: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
bac0: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
bad0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
bae0: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
baf0: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
bb00: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
bb10: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
bb20: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
bb30: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
bb40: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
bb50: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
bb60: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
bb70: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
bb80: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
bb90: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
bba0: 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
bbb0: 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
bbc0: 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
bbd0: 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
bbe0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
bbf0: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
bc00: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
bc10: 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
bc20: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
bc30: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
bc40: 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
bc50: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
bc60: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
bc70: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
bc80: 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
bc90: 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
bca0: 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
bcb0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
bcc0: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
bcd0: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
bce0: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
bcf0: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
bd00: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
bd10: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
bd20: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
bd30: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
bd40: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
bd50: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
bd60: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
bd70: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
bd80: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
bd90: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
bda0: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
bdb0: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
bdc0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
bdd0: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
bde0: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
bdf0: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
be00: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
be10: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
be20: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
be30: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
be40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
be50: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
be60: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
be70: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
be80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
be90: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
bea0: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
beb0: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
bec0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
bed0: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
bee0: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
bef0: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
bf00: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
bf10: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
bf20: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
bf30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bf40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bf50: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
bf60: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
bf70: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
bf80: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
bf90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
bfa0: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
bfb0: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
bfc0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
bfd0: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
bfe0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
bff0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
c000: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
c010: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
c020: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
c030: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
c040: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
c050: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
c060: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
c070: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
c080: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
c090: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
c0a0: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
c0b0: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
c0c0: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
c0d0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
c0e0: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
c0f0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
c100: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
c110: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
c120: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
c130: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
c140: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
c150: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
c160: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
c170: 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
c180: 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  nTab;.  sqlite3S
c190: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
c1a0: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
c1b0: 2d 3e 70 53 72 63 29 3b 0a 20 20 70 54 61 62 6c  ->pSrc);.  pTabl
c1c0: 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
c1d0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
c1e0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
c1f0: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
c200: 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  el);.  pParse->n
c210: 54 61 62 20 3d 20 6e 3b 0a 20 20 69 66 28 20 70  Tab = n;.  if( p
c220: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73  SelTab ){.    as
c230: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
c240: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ol==0 );.    pTa
c250: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
c260: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70  Tab->nCol;.    p
c270: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
c280: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
c290: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
c2a0: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d   0;.    pSelTab-
c2b0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73  >aCol = 0;.    s
c2c0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
c2d0: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
c2e0: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
c2f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
c300: 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72  ble->iDb, DB_Unr
c310: 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65  esetViews);.  }e
c320: 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  lse{.    pTable-
c330: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e  >nCol = 0;.    n
c340: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  Err++;.  }.  sql
c350: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c360: 28 70 53 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pSel);.  return
c370: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
c380: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c390: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
c3a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c3b0: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
c3c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
c3d0: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
c3e0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
c3f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c400: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
c410: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
c420: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
c430: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
c440: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
c450: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
c460: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
c470: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
c480: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
c490: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
c4a0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
c4b0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
c4c0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c4d0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
c4e0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
c4f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
c500: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
c510: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
c520: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
c530: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
c540: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
c550: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
c560: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
c570: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
c580: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c590: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
c5a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c5b0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
c5c0: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
c5d0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
c5e0: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
c5f0: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
c600: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
c610: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
c620: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
c630: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
c640: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
c650: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
c660: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
c670: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69  ** to iTo..*/.#i
c680: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c690: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
c6a0: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
c6b0: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
c6c0: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
c6d0: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
c6e0: 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72  *pElem;.  .  for
c6f0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
c700: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c  hFirst(&pDb->tbl
c710: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
c720: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
c730: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
c740: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
c750: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
c760: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
c770: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
c780: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
c790: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
c7a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
c7b0: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
c7c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
c7d0: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  Db->idxHash); pE
c7e0: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
c7f0: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
c800: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
c810: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
c820: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
c830: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
c840: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
c850: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
c860: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
c870: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
c880: 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  t(0);.}.#endif..
c890: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
c8a0: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
c8b0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
c8c0: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
c8d0: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
c8e0: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
c8f0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
c900: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
c910: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
c920: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
c930: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
c940: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
c950: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
c960: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
c970: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
c980: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
c990: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
c9a0: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
c9b0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
c9c0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
c9d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
c9e0: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
c9f0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
ca00: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
ca10: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
ca20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ca30: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
ca40: 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53   iDb);.#ifndef S
ca50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
ca60: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
ca70: 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20  stroy pushes an 
ca80: 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65  integer onto the
ca90: 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20   stack. If this 
caa0: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
cab0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
cac0: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
cad0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
cae0: 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
caf0: 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
cb00: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
cb10: 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
cb20: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
cb30: 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
cb40: 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
cb50: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22  **.  ** The "#0"
cb60: 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
cb70: 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
cb80: 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
cb90: 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
cba0: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
cbb0: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  f the stack.  Se
cbc0: 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  e sqlite3Registe
cbd0: 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  rExpr()..  */.  
cbe0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
cbf0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
cc00: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
cc10: 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
cc20: 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74  HERE #0 AND root
cc30: 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70  page=#0",.     p
cc40: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
cc50: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
cc60: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
cc70: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  able);.#endif.}.
cc80: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
cc90: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
cca0: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
ccb0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
ccc0: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
ccd0: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
cce0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
ccf0: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
cd00: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
cd10: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
cd20: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
cd30: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
cd40: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
cd50: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
cd60: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
cd70: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
cd80: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
cd90: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
cda0: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
cdb0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
cdc0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
cdd0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
cde0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
cdf0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ce00: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
ce10: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
ce20: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
ce30: 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  num, pTab->iDb);
ce40: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
ce50: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
ce60: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
ce70: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
ce80: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
ce90: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d  Idx->tnum, pIdx-
cea0: 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >iDb);.  }.#else
ceb0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
cec0: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
ced0: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
cee0: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
cef0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
cf00: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
cf10: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
cf20: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
cf30: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
cf40: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
cf50: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
cf60: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
cf70: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
cf80: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
cf90: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
cfa0: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
cfb0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
cfc0: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
cfd0: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
cfe0: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
cff0: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
d000: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
d010: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
d020: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
d030: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
d040: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
d050: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
d060: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
d070: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
d080: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
d090: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
d0a0: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
d0b0: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
d0c0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
d0d0: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
d0e0: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
d0f0: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
d100: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
d110: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
d120: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
d130: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
d140: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
d150: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
d160: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
d170: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
d180: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
d190: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
d1a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d1b0: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
d1c0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
d1d0: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
d1e0: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
d1f0: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
d200: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
d210: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
d220: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d230: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d240: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
d250: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
d260: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d270: 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  dx->iDb==pTab->i
d280: 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Db );.      if( 
d290: 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
d2a0: 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
d2b0: 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
d2c0: 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
d2d0: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
d2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d2f0: 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
d300: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d310: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
d320: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
d330: 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  st, pTab->iDb);.
d340: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
d350: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23   iLargest;.  }.#
d360: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
d370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d380: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
d390: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
d3a0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
d3b0: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
d3c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
d3d0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
d3e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d3f0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
d400: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
d410: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
d420: 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  iew){.  Table *p
d430: 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
d440: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d450: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
d460: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
d470: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
d480: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
d490: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
d4a0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73  drop_table;.  as
d4b0: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
d4c0: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
d4d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
d4e0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
d4f0: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
d500: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
d510: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
d520: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
d530: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
d540: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
d550: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
d560: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
d570: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
d580: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
d590: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
d5a0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
d5b0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
d5c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62  CHEMA_TABLE(pTab
d5d0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  ->iDb);.    cons
d5e0: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
d5f0: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
d600: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
d610: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
d620: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
d630: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
d640: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
d650: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
d660: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
d670: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
d680: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
d690: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
d6a0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
d6b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
d6c0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
d6d0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
d6e0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
d6f0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
d700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
d710: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
d720: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
d730: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
d740: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
d750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d760: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
d770: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
d780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d790: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
d7a0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
d7b0: 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
d7c0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
d7d0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
d7e0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
d7f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
d800: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
d810: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
d820: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
d830: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
d840: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
d850: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
d860: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d  ndif.  if( pTab-
d870: 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61  >readOnly || pTa
d880: 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b==db->aDb[iDb].
d890: 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73  pSeqTab ){.    s
d8a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d8b0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
d8c0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
d8d0: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
d8e0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
d8f0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
d900: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d910: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
d920: 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
d930: 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
d940: 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
d950: 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
d960: 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
d970: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
d980: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
d990: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
d9a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d9b0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
d9c0: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
d9d0: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
d9e0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
d9f0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
da00: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
da10: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
da20: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
da30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
da40: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
da50: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
da60: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
da70: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
da80: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
da90: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
daa0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
dab0: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
dac0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
dad0: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
dae0: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
daf0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
db00: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
db10: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69  if( v ){.    Tri
db20: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
db30: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 54      int iDb = pT
db40: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62 20  ab->iDb;.    Db 
db50: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
db60: 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb];.    sqlite
db70: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
db80: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
db90: 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72  iDb);..    /* Dr
dba0: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
dbb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
dbc0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
dbd0: 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
dbe0: 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
dbf0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
dc00: 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
dc10: 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
dc20: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
dc30: 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
dc40: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
dc50: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d  pTrigger = pTab-
dc60: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
dc70: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
dc80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dc90: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 69  pTrigger->iDb==i
dca0: 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e  Db || pTrigger->
dcb0: 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  iDb==1 );.      
dcc0: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
dcd0: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
dce0: 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  rigger, 1);.    
dcf0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
dd00: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
dd10: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
dd20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
dd30: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65  REMENT.    /* Re
dd40: 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
dd50: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
dd60: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
dd70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
dd80: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
dd90: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
dda0: 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
ddb0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
ddc0: 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74  ropped.    ** at
ddd0: 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
dde0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
ddf0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
de00: 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ble needs to.   
de10: 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
de20: 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
de30: 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
de40: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
de50: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
de60: 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20  ( pTab->autoInc 
de70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
de80: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
de90: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
dea0: 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  ETE FROM %s.sqli
deb0: 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
dec0: 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
ded0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
dee0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
def0: 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
df00: 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  f..    /* Drop a
df10: 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
df20: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
df30: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
df40: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
df50: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
df60: 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
df70: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
df80: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
df90: 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
dfa0: 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
dfb0: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
dfc0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
dfd0: 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
dfe0: 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
dff0: 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
e000: 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
e010: 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
e020: 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
e030: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
e040: 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
e050: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
e060: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
e070: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
e080: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
e090: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
e0a0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44  rse, .        "D
e0b0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
e0c0: 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
e0d0: 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
e0e0: 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20  igger'",.       
e0f0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
e100: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
e110: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e120: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
e130: 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61  .      destroyTa
e140: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
e150: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e160: 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
e170: 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
e180: 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
e190: 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
e1a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65  .    ** the sche
e1b0: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a  ma cookie..    *
e1c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
e1d0: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
e1e0: 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54  able, iDb, 0, pT
e1f0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
e200: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
e210: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
e220: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
e230: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
e240: 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f   iDb);..exit_dro
e250: 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
e260: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
e270: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
e280: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
e290: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
e2a0: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
e2b0: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
e2c0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
e2d0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
e2e0: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
e2f0: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
e300: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
e310: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
e320: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
e330: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
e340: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
e350: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
e360: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
e370: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
e380: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
e390: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
e3a0: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
e3b0: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
e3c0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
e3d0: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
e3e0: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
e3f0: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
e400: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
e410: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
e420: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
e430: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
e440: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
e450: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
e460: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
e470: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
e480: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
e490: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
e4a0: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
e4b0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
e4c0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
e4d0: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
e4e0: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
e4f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
e500: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
e510: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
e520: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
e530: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
e540: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
e550: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
e560: 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  l sqlite3EndTabl
e570: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
e580: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
e590: 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
e5a0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
e5b0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
e5c0: 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
e5d0: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
e5e0: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
e5f0: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
e600: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
e610: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
e620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e630: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e640: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e650: 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
e660: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
e670: 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
e680: 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
e690: 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
e6a0: 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
e6b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
e6c0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
e6d0: 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
e6e0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
e6f0: 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
e700: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
e710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e720: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
e730: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
e740: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
e750: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
e760: 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
e770: 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  ey = 0;.  Table 
e780: 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
e790: 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
e7a0: 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
e7b0: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
e7c0: 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
e7d0: 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
e7e0: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
e7f0: 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65  nErr ) goto fk_e
e800: 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
e810: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
e820: 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
e830: 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  1;.    if( iCol<
e840: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
e850: 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
e860: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
e870: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
e880: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e890: 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
e8a0: 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
e8b0: 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
e8c0: 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
e8d0: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
e8e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
e8f0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
e900: 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
e910: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
e920: 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
e930: 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
e940: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
e950: 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
e960: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
e970: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e980: 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
e990: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
e9a0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
e9b0: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
e9c0: 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
e9d0: 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
e9e0: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
e9f0: 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
ea00: 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
ea10: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
ea20: 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
ea30: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
ea40: 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c  f(*pFKey) + nCol
ea50: 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
ea60: 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
ea70: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
ea80: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
ea90: 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
eaa0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
eab0: 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28  nByte += strlen(
eac0: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
ead0: 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
eae0: 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
eaf0: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  iteMalloc( nByte
eb00: 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
eb10: 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  =0 ) goto fk_end
eb20: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  ;.  pFKey->pFrom
eb30: 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
eb40: 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
eb50: 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
eb60: 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70  *)&pFKey[1];.  p
eb70: 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74  FKey->aCol = (st
eb80: 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b  ruct sColMap*)z;
eb90: 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73  .  z += sizeof(s
eba0: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e  truct sColMap)*n
ebb0: 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  Col;.  pFKey->zT
ebc0: 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
ebd0: 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
ebe0: 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
ebf0: 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  = 0;.  z += pTo-
ec00: 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  >n+1;.  pFKey->p
ec10: 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46  NextTo = 0;.  pF
ec20: 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
ec30: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
ec40: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
ec50: 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
ec60: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
ec70: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
ec80: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ec90: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
eca0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
ecb0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
ecc0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ecd0: 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
ece0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
ecf0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
ed00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ed10: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
ed20: 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
ed30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ed40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ed50: 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
ed60: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
ed70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ed80: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
ed90: 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
eda0: 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
edb0: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
edc0: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
edd0: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
ede0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
edf0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
ee00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
ee10: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
ee20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
ee30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
ee40: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f  t n = strlen(pTo
ee50: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
ee60: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
ee70: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
ee80: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
ee90: 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
eea0: 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
eeb0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
eec0: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
eed0: 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
eee0: 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
eef0: 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20  Key->deleteConf 
ef00: 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a  = flags & 0xff;.
ef10: 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43    pFKey->updateC
ef20: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
ef30: 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46  8 ) & 0xff;.  pF
ef40: 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20  Key->insertConf 
ef50: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29  = (flags >> 16 )
ef60: 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c   & 0xff;..  /* L
ef70: 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
ef80: 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
ef90: 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
efa0: 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
efb0: 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
efc0: 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
efd0: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
efe0: 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
eff0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f000: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
f010: 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
f020: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46  xprListDelete(pF
f030: 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
f040: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
f050: 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  (pToCol);.}../*.
f060: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f070: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
f080: 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
f090: 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
f0a0: 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
f0b0: 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
f0c0: 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
f0d0: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
f0e0: 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
f0f0: 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
f100: 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
f110: 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
f120: 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
f130: 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
f140: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
f150: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
f160: 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
f170: 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
f180: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
f190: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
f1a0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
f1b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
f1c0: 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
f1d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f1e0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
f1f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
f200: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
f210: 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
f220: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
f230: 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
f240: 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
f250: 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
f260: 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
f270: 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
f280: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f290: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
f2a0: 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
f2b0: 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
f2c0: 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
f2d0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
f2e0: 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
f2f0: 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
f300: 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
f310: 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
f320: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
f330: 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
f340: 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
f350: 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
f360: 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
f370: 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
f380: 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
f390: 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  ed.  The memory 
f3a0: 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62  cell specified b
f3b0: 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
f3c0: 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
f3d0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
f3e0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
f3f0: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
f400: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
f410: 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
f420: 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
f430: 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
f440: 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
f450: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
f460: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
f470: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
f480: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
f490: 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
f4a0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
f4b0: 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
f4c0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
f4d0: 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
f4e0: 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
f4f0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
f500: 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
f510: 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
f520: 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
f530: 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
f540: 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  ->nTab;       /*
f550: 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
f560: 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
f570: 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
f580: 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20  se->nTab+1;     
f590: 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
f5a0: 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
f5b0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
f5e0: 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
f5f0: 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
f620: 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  f index */.  Vdb
f630: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
f640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
f650: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
f660: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
f670: 61 63 68 69 6e 65 20 2a 2f 0a 0a 23 69 66 6e 64  achine */..#ifnd
f680: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f690: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
f6a0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
f6b0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f6c0: 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
f6d0: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
f6e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
f6f0: 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
f700: 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
f710: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
f720: 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  if..  /* Ensure 
f730: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 64  all the required
f740: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
f750: 6e 63 65 73 20 61 72 65 20 61 76 61 69 6c 61 62  nces are availab
f760: 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 72 6f  le. This.  ** ro
f770: 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 76 6f 6b  utine will invok
f780: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d  e the collation-
f790: 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20  needed callback 
f7a0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 28 61 6e  if necessary (an
f7b0: 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 68 61  d.  ** if one ha
f7c0: 73 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  s been registere
f7d0: 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  d)..  */.  if( s
f7e0: 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78  qlite3CheckIndex
f7f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
f800: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 72  pIndex) ){.    r
f810: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 76 20  eturn;.  }..  v 
f820: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f830: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f840: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
f850: 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
f860: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
f870: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f880: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
f890: 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
f8a0: 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
f8b0: 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
f8c0: 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
f8d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8e0: 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
f8f0: 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  um, pIndex->iDb)
f900: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
f910: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
f920: 6e 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e  nteger, pIndex->
f930: 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  iDb, 0);.  sqlit
f940: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
f950: 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
f960: 20 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20   tnum,.         
f970: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
f980: 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
f990: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
f9a0: 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
f9b0: 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c  bleForReading(v,
f9c0: 20 69 54 61 62 2c 20 70 54 61 62 29 3b 0a 20 20   iTab, pTab);.  
f9d0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
f9e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
f9f0: 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
fa00: 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
fa10: 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49  teIndexKey(v, pI
fa20: 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20 69  ndex, iTab);.  i
fa30: 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  f( pIndex->onErr
fa40: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
fa50: 20 20 20 69 6e 74 20 63 75 72 61 64 64 72 20 3d     int curaddr =
fa60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
fa70: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
fa80: 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75 72 61  int addr2 = cura
fa90: 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74  ddr+4;.    sqlit
faa0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
fab0: 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61 64 64  , curaddr-1, add
fac0: 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r2);.    sqlite3
fad0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fae0: 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 30 29 3b  Rowid, iTab, 0);
faf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fb00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
fb10: 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  mm, 1, 0);.    s
fb20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fb30: 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20  v, OP_IsUnique, 
fb40: 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a 20 20  iIdx, addr2);.  
fb50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
fb60: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
fb70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
fb80: 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20 20 20  OE_Abort,.      
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
fba0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
fbb0: 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
fbc0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
fbd0: 61 73 73 65 72 74 28 20 61 64 64 72 32 3d 3d 73  assert( addr2==s
fbe0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
fbf0: 74 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d 0a  tAddr(v) );.  }.
fc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc10: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
fc20: 72 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  rt, iIdx, 0);.  
fc30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc40: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
fc50: 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73  b, addr1+1);.  s
fc60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fc70: 50 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c  P2(v, addr1, sql
fc80: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
fc90: 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74  ddr(v));.  sqlit
fca0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fcb0: 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30  P_Close, iTab, 0
fcc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
fcd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
fce0: 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a  e, iIdx, 0);.}..
fcf0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
fd00: 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
fd10: 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
fd20: 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
fd30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
fd40: 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
fd50: 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
fd60: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
fd70: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
fd80: 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
fd90: 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
fda0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
fdb0: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
fdc0: 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
fdd0: 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
fde0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
fdf0: 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
fe00: 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
fe10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
fe20: 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
fe30: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
fe40: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
fe50: 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
fe60: 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
fe70: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
fe80: 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
fe90: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
fea0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
feb0: 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
fec0: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
fed0: 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
fee0: 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
fef0: 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
ff00: 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
ff10: 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
ff20: 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
ff30: 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
ff40: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
ff50: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
ff60: 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
ff70: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
ff80: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
ff90: 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
ffa0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
ffb0: 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
ffc0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
ffd0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
ffe0: 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
fff0: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
10000 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
10010 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
10020 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
10030 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
10040 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
10050 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
10060 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
10070 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10080 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
10090 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
100a0 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
100b0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
100c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
100d0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
100e0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
100f0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
10100 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
10110 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
10120 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
10130 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
10140 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
10150 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
10160 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 20  ken *pEnd       
10170 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
10180 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
10190 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
101a0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
101b0 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a   *pTab = 0;   /*
101c0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
101d0 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
101e0 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20  *pIndex = 0; /* 
101f0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
10200 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
10210 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
10220 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
10230 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20  n nullId;    /* 
10240 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
10250 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
10260 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
10270 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73  x;    /* For ass
10280 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
10290 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
102a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
102b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
102c0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
102d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
102e0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
102f0 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
10300 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
10310 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
10320 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
10330 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
10340 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  eate */..  if( p
10350 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
10360 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
10370 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
10380 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
10390 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
103a0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
103b0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
103c0 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
103d0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
103e0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
103f0 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
10400 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
10410 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
10420 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
10430 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
10440 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
10450 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
10460 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
10470 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
10480 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
10490 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
104a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
104b0 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
104c0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
104d0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
104e0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
104f0 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
10500 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
10510 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10520 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ndex;..#ifndef S
10530 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
10540 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
10550 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
10560 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
10570 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62  k if the the tab
10580 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
10590 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
105a0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
105b0 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a  se to 1..    */.
105c0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
105d0 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
105e0 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
105f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65  );.    if( pName
10600 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d  2 && pName2->n==
10610 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
10620 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  b->iDb==1 ){.   
10630 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
10640 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
10650 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
10660 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
10670 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
10680 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20  ame) &&.        
10690 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
106a0 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
106b0 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
106c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
106d0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
106e0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
106f0 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
10700 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  se, pTblName->a[
10710 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  0].zName, .     
10720 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30     pTblName->a[0
10730 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
10740 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
10750 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10760 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
10770 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62  ( iDb==pTab->iDb
10780 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
10790 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
107a0 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
107b0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
107c0 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54  le;.    iDb = pT
107d0 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20  ab->iDb;.  }..  
107e0 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
107f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
10800 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10810 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
10820 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
10830 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10840 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
10850 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
10860 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
10870 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
10880 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10890 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
108a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
108b0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
108c0 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
108d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
108e0 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
108f0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
10900 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
10910 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
10920 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
10930 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
10940 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
10950 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
10960 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
10970 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
10980 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
10990 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
109a0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
109b0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
109c0 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
109d0 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
109e0 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
109f0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
10a00 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
10a10 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
10a20 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
10a30 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
10a40 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
10a50 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
10a60 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
10a70 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
10a80 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
10a90 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
10aa0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
10ab0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
10ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
10ad0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
10ae0 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
10af0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
10b00 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
10b10 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
10b20 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
10b30 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
10b40 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
10b50 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
10b60 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
10b70 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
10b80 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  me);.    if( SQL
10b90 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
10ba0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
10bb0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
10bc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10bd0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
10be0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10bf0 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53  index;.    if( S
10c00 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
10c10 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
10c20 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
10c30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
10c40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10c50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
10c60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
10c70 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
10c80 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
10c90 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
10ca0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
10cb0 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
10cc0 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pTSameName;    
10cd0 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20  /* A table with 
10ce0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
10cf0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
10d00 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
10d10 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
10d20 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
10d30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10d40 78 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  x;.      if( (pI
10d50 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
10d60 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
10d70 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  zName, db->aDb[i
10d80 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29  Db].zName))!=0 )
10d90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10da0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10db0 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
10dc0 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
10dd0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
10de0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10df0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
10e00 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61     if( (pTSameNa
10e10 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  me = sqlite3Find
10e20 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
10e30 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   0))!=0 ){.     
10e40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10e50 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
10e60 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
10e70 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
10e80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
10e90 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10ea0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
10eb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
10ec0 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
10ed0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
10ee0 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
10ef0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
10f00 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
10f10 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
10f20 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
10f30 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
10f40 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20  uf,"_%d",n);.   
10f50 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
10f60 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
10f70 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  (&zName, "sqlite
10f80 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54  _autoindex_", pT
10f90 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c  ab->zName, zBuf,
10fa0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
10fb0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
10fc0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10fd0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
10fe0 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
10ff0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
11000 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
11010 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11020 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11030 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
11040 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
11050 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
11060 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11070 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
11080 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
11090 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
110a0 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
110b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
110c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
110d0 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
110e0 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
110f0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
11100 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
11110 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
11120 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
11130 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
11140 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11150 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
11160 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
11170 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11180 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11190 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
111a0 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
111b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
111c0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
111d0 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
111e0 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
111f0 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
11200 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
11210 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
11220 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
11230 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
11240 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
11250 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
11260 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
11270 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
11280 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
11290 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
112a0 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
112b0 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  rlen(nullId.z);.
112c0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
112d0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
112e0 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29  d(0, 0, &nullId)
112f0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
11300 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
11310 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11320 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
11330 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
11340 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
11350 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
11360 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
11370 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
11380 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73 69  (zName) + 1 + si
11390 7a 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20 20  zeof(int) +.    
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29      (sizeof(int)
113c0 2a 32 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  *2 + sizeof(Coll
113d0 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45  Seq*))*pList->nE
113e0 78 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  xpr );.  if( sql
113f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
11400 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
11410 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
11420 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
11430 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d  = (int*)&pIndex-
11440 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70  >keyInfo.aColl[p
11450 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
11460 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
11470 20 3d 20 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f   = &pIndex->aiCo
11480 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  lumn[pList->nExp
11490 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  r];.  pIndex->zN
114a0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ame = (char*)&pI
114b0 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 70  ndex->aiRowEst[p
114c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b 0a  List->nExpr+1];.
114d0 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
114e0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
114f0 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
11500 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
11510 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
11520 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
11530 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
11540 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
11550 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
11560 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
11570 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20  ->iDb = iDb;..  
11580 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
11590 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
115a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
115b0 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
115c0 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
115d0 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
115e0 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
115f0 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
11600 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
11610 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
11620 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
11630 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
11640 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11650 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
11660 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
11670 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11680 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
11690 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
116a0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
116b0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
116c0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
116d0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
116e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
116f0 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
11700 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
11710 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
11720 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
11730 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
11740 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
11750 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11760 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
11770 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
11780 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70  ] = j;.    if( p
11790 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
117a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
117b0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ( pList->a[i].pE
117c0 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
117d0 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
117e0 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
117f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11800 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  ->pColl;.    }el
11810 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  se{.      pIndex
11820 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11830 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  i] = pTab->aCol[
11840 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].pColl;.    }.
11850 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
11860 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11870 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  l[i] );.    if( 
11880 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
11890 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
118a0 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
118b0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b  Parse, pIndex->k
118c0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
118d0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
118e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
118f0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
11900 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
11910 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73  fo.nField = pLis
11920 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69  t->nExpr;.  sqli
11930 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
11940 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28  (pIndex);..  if(
11950 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
11960 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
11970 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
11980 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
11990 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
119a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
119b0 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
119c0 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
119d0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
119e0 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
119f0 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
11a00 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
11a10 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
11a20 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
11a30 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
11a40 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
11a50 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
11a60 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
11a70 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
11a80 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
11a90 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
11aa0 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
11ab0 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
11ac0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
11ad0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
11ae0 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
11af0 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
11b00 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
11b10 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
11b20 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
11b30 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
11b40 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
11b50 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
11b60 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
11b70 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
11b80 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
11b90 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
11ba0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
11bb0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
11bc0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
11bd0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
11be0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
11bf0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
11c00 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
11c10 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
11c20 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
11c30 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
11c40 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
11c50 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
11c60 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
11c70 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
11c80 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
11c90 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
11ca0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
11cb0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
11cc0 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
11cd0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
11ce0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
11cf0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
11d00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11d10 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  if( pIdx->keyInf
11d20 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64  o.aColl[k]!=pInd
11d30 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11d40 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  l[k] ) break;.  
11d50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11d60 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
11d70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11d80 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
11d90 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
11da0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
11db0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
11dc0 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
11dd0 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
11de0 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
11df0 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
11e00 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
11e10 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
11e20 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
11e30 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
11e40 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
11e50 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
11e60 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
11e70 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
11e80 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
11e90 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
11ea0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
11eb0 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
11ec0 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
11ed0 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
11ee0 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
11ef0 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
11f00 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
11f10 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
11f20 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
11f30 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
11f40 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
11f50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
11f60 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
11f70 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
11f80 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
11f90 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
11fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
11fb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11fc0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
11fd0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
11fe0 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
11ff0 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
12000 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
12010 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
12020 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
12030 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
12040 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
12050 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
12060 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
12070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12080 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
12090 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
120a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
120b0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
120c0 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
120d0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
120e0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
120f0 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
12100 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
12110 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
12120 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
12130 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
12140 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
12150 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
12160 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
12170 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  b].idxHash, .   
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
121a0 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
121b0 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
121c0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
121d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
121e0 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
121f0 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
12200 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
12210 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12220 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12230 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
12240 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
12250 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
12260 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
12270 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
12280 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
12290 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
122a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
122b0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
122c0 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
122d0 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
122e0 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
122f0 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
12300 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
12310 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
12320 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
12330 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
12340 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
12350 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
12360 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
12370 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
12380 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
12390 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
123a0 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
123b0 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
123c0 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
123d0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
123e0 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
123f0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
12400 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
12410 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
12420 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
12430 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
12440 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
12450 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
12460 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
12470 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
12480 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
12490 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
124a0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
124b0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
124c0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
124d0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
124e0 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
124f0 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
12500 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
12510 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
12520 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
12530 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
12540 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
12550 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
12560 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
12570 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
12580 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
12590 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
125a0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
125b0 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
125c0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
125d0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
125e0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20  rse->nMem++;..  
125f0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12600 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12610 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
12620 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12630 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  dex;..    /* Cre
12640 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
12650 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
12660 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
12670 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
12680 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
12690 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
126a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
126b0 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
126c0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
126d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
126e0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
126f0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  , 0);..    /* Ga
12700 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
12710 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
12720 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
12730 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
12740 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
12750 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
12760 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
12770 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  d ){.      /* A 
12780 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
12790 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
127a0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
127b0 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
127c0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
127d0 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e  ntf("CREATE%s IN
127e0 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
127f0 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
12800 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
12810 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
12820 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
12830 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
12840 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
12850 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
12860 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
12870 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
12880 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
12890 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
128a0 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
128b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
128c0 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
128d0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
128e0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
128f0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
12900 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
12910 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
12920 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
12930 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
12940 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
12950 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
12960 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25  ndex',%Q,%Q,#0,%
12970 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
12980 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
12990 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
129a0 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
129b0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
129c0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
129d0 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
129e0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
129f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12a00 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
12a10 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d   sqliteFree(zStm
12a20 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
12a30 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
12a40 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
12a50 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
12a60 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
12a70 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
12a80 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
12a90 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
12aa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12ab0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
12ac0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
12ad0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
12ae0 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
12af0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
12b00 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
12b10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12b20 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
12b30 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
12b40 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
12b50 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65  te3MPrintf("name
12b60 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
12b70 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
12b80 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
12b90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12ba0 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b  P_Expire, 0, 0);
12bb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12bc0 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
12bd0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
12be0 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
12bf0 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
12c00 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
12c10 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
12c20 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
12c30 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
12c40 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
12c50 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
12c60 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
12c70 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
12c80 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
12c90 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
12ca0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
12cb0 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
12cc0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
12cd0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
12ce0 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
12cf0 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
12d00 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
12d10 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
12d20 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
12d30 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
12d40 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
12d50 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
12d60 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
12d70 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
12d80 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
12d90 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
12da0 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
12db0 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
12dc0 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
12dd0 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
12de0 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
12df0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
12e00 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
12e10 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
12e20 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
12e30 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
12e40 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
12e50 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
12e60 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
12e70 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
12e80 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
12e90 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
12ea0 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65   ){.    freeInde
12eb0 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
12ec0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12ed0 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
12ee0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
12ef0 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b  elete(pTblName);
12f00 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
12f10 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
12f20 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
12f30 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
12f40 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
12f50 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
12f60 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
12f70 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
12f80 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 20 41 4e  en we have no AN
12f90 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 74 6f  ALYZE command to
12fa0 20 72 75 6e 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f   run..**.** aiRo
12fb0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
12fc0 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
12fd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
12fe0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
12ff0 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
13000 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
13010 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
13020 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
13030 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
13040 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
13050 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
13060 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
13070 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
13080 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
13090 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
130a0 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
130b0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
130c0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
130d0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
130e0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
130f0 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
13100 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
13110 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
13120 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
13130 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
13140 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
13150 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
13160 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
13170 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
13180 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
13190 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
131a0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
131b0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
131c0 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
131d0 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
131e0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
131f0 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
13200 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
13210 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
13220 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
13230 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
13240 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
13250 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
13260 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13270 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
13280 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
13290 6e 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  nt *a = pIdx->ai
132a0 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
132b0 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
132c0 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
132d0 30 30 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  000;.  switch( p
132e0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
132f0 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
13300 20 20 20 20 61 5b 31 5d 20 3d 20 32 30 3b 0a 20      a[1] = 20;. 
13310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13320 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 0a  }.    case 2: {.
13330 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 33 35 30        a[1] = 350
13340 3b 0a 20 20 20 20 20 20 61 5b 32 5d 20 3d 20 32  ;.      a[2] = 2
13350 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
13360 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
13370 74 3a 20 7b 0a 20 20 20 20 20 20 61 5b 31 5d 20  t: {.      a[1] 
13380 3d 20 31 32 35 30 3b 0a 20 20 20 20 20 20 61 5b  = 1250;.      a[
13390 32 5d 20 3d 20 33 35 30 3b 0a 20 20 20 20 20 20  2] = 350;.      
133a0 61 5b 33 5d 20 3d 20 32 30 3b 0a 20 20 20 20 20  a[3] = 20;.     
133b0 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f   for(i=pIdx->nCo
133c0 6c 75 6d 6e 3b 20 69 3e 3d 34 3b 20 69 2d 2d 29  lumn; i>=4; i--)
133d0 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
133e0 20 31 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   10;.      }.   
133f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64   }.  }.  if( pId
13400 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
13410 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64  one ){.    a[pId
13420 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b  x->nColumn] = 1;
13430 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
13440 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13450 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
13460 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
13470 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
13480 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
13490 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
134a0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
134b0 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
134c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
134d0 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ist *pName){.  I
134e0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
134f0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
13500 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13510 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
13520 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
13530 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
13540 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
13550 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13560 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
13570 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
13580 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13590 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
135a0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
135b0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
135c0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
135d0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
135e0 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
135f0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
13600 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
13610 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
13620 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
13630 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13640 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
13650 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
13660 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
13670 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
13680 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13690 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
136a0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
136b0 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
136c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
136d0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
136e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
136f0 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
13700 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
13710 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
13720 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
13730 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13740 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  op_index;.  }.#i
13750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13760 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
13770 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
13780 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
13790 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
137a0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
137b0 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
137c0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
137d0 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
137e0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
137f0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
13800 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49   SCHEMA_TABLE(pI
13810 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
13820 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
13830 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
13840 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
13850 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
13860 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13870 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
13880 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
13890 50 44 42 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  PDB && pIndex->i
138a0 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
138b0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
138c0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
138d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
138e0 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
138f0 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
13900 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
13910 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
13920 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
13930 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
13940 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13950 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
13960 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
13970 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
13980 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13990 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
139a0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e   if( v ){.    in
139b0 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d 3e  t iDb = pIndex->
139c0 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
139d0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
139e0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
139f0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
13a00 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
13a10 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
13a20 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
13a30 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
13a40 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
13a50 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
13a60 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
13a70 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
13a80 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
13a90 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
13aa0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
13ab0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
13ac0 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
13ad0 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d   iDb, 0, pIndex-
13ae0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
13af0 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
13b00 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
13b10 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
13b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
13b30 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
13b40 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
13b50 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
13b60 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
13b70 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
13b80 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
13b90 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
13ba0 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
13bb0 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
13bc0 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
13bd0 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
13be0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
13bf0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13c00 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
13c10 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
13c20 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
13c30 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
13c40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
13c50 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
13c60 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
13c70 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e  st->nId>=pList->
13c80 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74  nAlloc ){.    st
13c90 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
13ca0 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   *a;.    pList->
13cb0 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e  nAlloc = pList->
13cc0 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20  nAlloc*2 + 5;.  
13cd0 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c    a = sqliteReal
13ce0 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  loc(pList->a, pL
13cf0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ist->nAlloc*size
13d00 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
13d10 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
13d20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13d30 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
13d40 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
13d50 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
13d60 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
13d70 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
13d80 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c  ->a[pList->nId],
13d90 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
13da0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69 73  ->a[0]));.  pLis
13db0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
13dc0 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
13dd0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
13de0 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d 3e  oken);.  pList->
13df0 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  nId++;.  return 
13e00 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
13e10 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
13e20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13e30 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
13e40 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
13e50 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
13e60 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
13e70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
13e80 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
13e90 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
13ea0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
13eb0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
13ec0 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
13ed0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
13ee0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
13ef0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
13f00 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
13f10 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
13f20 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
13f30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
13f40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
13f50 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
13f60 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
13f70 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
13f80 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
13f90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
13fa0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
13fb0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
13fc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
13fd0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
13fe0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
13ff0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
14000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
14010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
14020 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
14030 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
14040 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
14050 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
14060 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
14070 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
14080 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
14090 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
140a0 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
140b0 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
140c0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
140d0 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
140e0 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
140f0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
14100 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
14110 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
14120 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
14130 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
14140 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
14150 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
14160 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
14170 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
14180 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
14190 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
141a0 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
141b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
141c0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
141d0 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
141e0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
141f0 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
14200 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
14210 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
14220 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
14230 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
14240 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
14250 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
14260 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
14270 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
14280 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
14290 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
142a0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
142b0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
142c0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
142d0 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
142e0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
142f0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14300 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
14310 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
14320 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
14330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
14340 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
14350 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
14360 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
14370 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
14380 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
14390 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
143a0 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
143b0 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
143c0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
143d0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
143e0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
143f0 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
14400 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
14410 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
14420 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
14430 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14440 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
14450 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
14460 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
14470 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
14480 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
14490 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
144a0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
144b0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
144c0 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
144d0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
144e0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
144f0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
14500 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
14510 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
14520 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
14530 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
14540 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
14550 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
14560 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
14570 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
14580 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14590 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
145a0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
145b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
145c0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
145d0 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
145e0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
145f0 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
14600 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
14610 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
14620 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
14630 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
14640 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
14650 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
14660 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
14670 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
14680 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
14690 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
146a0 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
146b0 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
146c0 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
146d0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
146e0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
146f0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
14700 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
14710 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
14720 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
14730 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
14740 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
14750 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
14760 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
14770 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
14780 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
14790 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
147a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
147b0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
147c0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
147d0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
147e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
147f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
14800 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74  ;.  for(i=0, pIt
14810 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
14820 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
14830 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
14840 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
14850 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
14860 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
14870 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14880 2b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  +;.    if( pItem
14890 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
148a0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
148b0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
148c0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
148d0 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
148e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
148f0 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
14900 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
14910 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
14920 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
14930 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14940 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
14950 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
14960 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
14970 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
14980 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
14990 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70  {.    pList->a[p
149a0 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41  List->nSrc-1].zA
149b0 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
149c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
149d0 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
149e0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
149f0 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
14a00 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
14a10 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
14a20 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
14a30 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
14a40 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
14a50 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
14a60 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14a70 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14a80 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
14a90 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
14aa0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
14ab0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
14ac0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
14ad0 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
14ae0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
14af0 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
14b00 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
14b10 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  (pItem->zAlias);
14b20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
14b30 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d  teTable(0, pItem
14b40 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
14b50 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
14b60 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
14b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
14b80 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
14b90 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
14ba0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
14bb0 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
14bc0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
14bd0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
14be0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
14bf0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
14c00 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
14c10 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
14c20 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
14c30 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
14c40 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
14c50 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
14c60 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
14c70 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
14c80 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
14c90 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
14ca0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
14cb0 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
14cc0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
14cd0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14ce0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14cf0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
14d00 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
14d10 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
14d20 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14d30 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
14d40 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
14d50 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
14d60 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
14d70 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
14d80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14d90 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14da0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
14db0 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
14dc0 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  IVE)+1);.    }. 
14dd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
14de0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
14df0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
14e00 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
14e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14e20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
14e30 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
14e40 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14e50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14e60 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
14e70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
14e80 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
14e90 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
14ea0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
14eb0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
14ec0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
14ed0 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
14ee0 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
14ef0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14f00 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
14f10 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
14f20 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14f30 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14f40 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14f50 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
14f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14f70 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
14f80 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
14f90 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
14fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14fb0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
14fc0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
14fd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
14fe0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
14ff0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
15000 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
15010 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
15020 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
15030 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
15040 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
15050 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
15060 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
15070 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15080 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15090 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
150a0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
150b0 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
150c0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
150d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
150e0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
150f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15100 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
15110 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
15120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
15130 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
15140 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
15150 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
15160 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
15170 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
15180 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
15190 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
151a0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
151b0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
151c0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  ic int sqlite3Op
151d0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
151e0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
151f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15200 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
15210 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
15220 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
15230 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
15240 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
15250 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
15260 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
15270 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
15280 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
152a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
152b0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
152c0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
152d0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
152e0 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
152f0 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
15300 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
15310 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
15320 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
15330 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
15340 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
15350 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
15360 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15370 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
15380 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
15390 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 1);.      if
153a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
153b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
153c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
153d0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
153e0 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
153f0 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
15400 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
15410 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
15420 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
15430 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
15440 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
15450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15460 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
15470 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
15480 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
15490 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
154a0 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
154b0 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
154c0 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
154d0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
154e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
154f0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
15500 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
15510 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
15520 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
15530 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
15540 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
15550 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
15560 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
15570 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
15580 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
15590 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
155a0 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
155b0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
155c0 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
155d0 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
155e0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
155f0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
15600 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
15610 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
15620 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
15630 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
15640 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
15650 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
15660 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
15670 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
15680 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
15690 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
156a0 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
156b0 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
156c0 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
156d0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
156e0 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
156f0 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
15700 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
15710 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
15720 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
15730 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
15740 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
15750 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
15760 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
15770 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
15780 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
15790 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
157a0 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
157b0 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
157c0 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
157d0 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
157e0 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
157f0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
15800 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
15810 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
15820 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
15830 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
15840 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
15850 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
15860 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
15870 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
15880 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
15890 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
158a0 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
158b0 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
158c0 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
158d0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
158e0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
158f0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
15900 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
15910 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
15920 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
15930 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
15940 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15950 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
15960 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
15970 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
15980 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
15990 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
159a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
159b0 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
159c0 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
159d0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
159e0 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
159f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
15a00 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
15a10 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
15a20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
15a30 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
15a40 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
15a50 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
15a60 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
15a70 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20  rt( iDb<32 );.  
15a80 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
15a90 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
15aa0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
15ab0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
15ac0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
15ad0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
15ae0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
15af0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
15b00 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
15b10 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
15b20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
15b30 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
15b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
15b50 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
15b60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
15b70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15b80 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
15b90 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
15ba0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
15bb0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
15bc0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
15bd0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
15be0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15bf0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
15c00 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
15c10 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
15c20 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
15c30 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
15c40 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
15c50 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
15c60 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
15c70 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
15c80 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
15c90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
15ca0 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
15cb0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
15cc0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
15cd0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
15ce0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
15cf0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
15d00 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
15d10 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
15d20 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
15d30 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
15d40 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
15d50 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
15d60 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
15d70 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
15d80 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
15d90 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
15da0 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
15db0 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
15dc0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
15dd0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
15de0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
15df0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
15e00 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
15e10 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
15e20 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
15e30 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
15e40 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
15e50 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
15e60 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
15e70 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
15e80 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
15e90 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
15ea0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
15eb0 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
15ec0 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
15ed0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
15ee0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
15ef0 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
15f00 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
15f10 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
15f20 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
15f30 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
15f40 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
15f50 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
15f60 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15f70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15f80 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
15f90 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
15fa0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
15fb0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15fc0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
15fd0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
15fe0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
15ff0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
16000 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
16010 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
16020 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
16030 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
16040 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16050 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16060 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
16070 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28   0);.  }.  if( (
16080 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
16090 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65  Db!=1) && pParse
160a0 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
160b0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
160c0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
160d0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
160e0 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
160f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
16100 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
16110 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
16120 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
16130 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
16140 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
16150 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
16160 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
16170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16180 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
16190 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
161a0 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43  atch(CollSeq *pC
161b0 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
161c0 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ex){.  int n = p
161d0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e  Index->keyInfo.n
161e0 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71  Field;.  CollSeq
161f0 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e   **pp = pIndex->
16200 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20  keyInfo.aColl;. 
16210 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20   while( n-- ){. 
16220 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c     if( *pp==pCol
16230 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
16240 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65    pp++;.  }.  re
16250 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
16260 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
16270 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
16280 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
16290 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
162a0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
162b0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
162c0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
162d0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
162e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
162f0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
16300 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
16310 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16320 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c  Table *pTab, Col
16330 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
16340 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
16350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16360 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
16370 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
16380 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
16390 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
163a0 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
163b0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
163c0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( pColl==0 || c
163d0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43  ollationMatch(pC
163e0 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20  oll,pIndex) ){. 
163f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
16400 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16410 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d  pParse, 0, pTab-
16420 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  >iDb);.      sql
16430 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
16440 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
16450 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
16460 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
16470 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
16480 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
16490 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
164a0 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
164b0 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
164c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
164d0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
164e0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
164f0 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
16500 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
16510 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16520 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
16530 0a 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74  .void reindexDat
16540 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
16550 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70  arse, CollSeq *p
16560 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
16570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16580 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
16590 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
165a0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
165b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
165c0 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
165d0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
165e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
165f0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
16600 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16610 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
16620 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
16630 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
16640 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
16650 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
16660 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
16670 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
16680 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
16690 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62  se */..  for(iDb
166a0 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
166b0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
166c0 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
166d0 20 69 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f   if( pDb==0 ) co
166e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
166f0 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
16700 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29  t(&pDb->tblHash)
16710 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
16720 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
16730 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
16740 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
16750 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
16760 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
16770 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, pColl);.   
16780 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
16790 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
167a0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
167b0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
167c0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
167d0 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
167f0 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
16800 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
16810 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
16820 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
16830 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
16840 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
16850 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
16860 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
16870 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
16880 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
16890 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
168a0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
168b0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
168c0 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
168d0 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
168e0 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
168f0 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
16900 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
16910 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
16920 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
16930 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
16940 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
16950 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
16960 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
16970 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
16980 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
16990 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
169a0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
169b0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
169c0 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
169d0 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
169e0 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
169f0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
16a00 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
16a10 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
16a20 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
16a30 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
16a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16a50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16a60 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
16a70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
16a80 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
16a90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16aa0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
16ab0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
16ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16ad0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
16ae0 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
16af0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
16b00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
16b10 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
16b20 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
16b30 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
16b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16b50 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
16b60 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
16b70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16b80 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
16b90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16ba0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
16bb0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
16bc0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
16bd0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
16be0 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
16bf0 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
16c00 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
16c10 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
16c20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
16c30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
16c40 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
16c50 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
16c60 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
16c70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
16c80 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
16c90 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
16ca0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
16cb0 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61  pName1==0 || pNa
16cc0 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me1->z==0 ){.   
16cd0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
16ce0 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
16cf0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
16d00 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20  e if( pName2==0 
16d10 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
16d20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
16d30 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
16d40 71 28 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70  q(db, db->enc, p
16d50 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31  Name1->z, pName1
16d60 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
16d70 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
16d80 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
16d90 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b  (pParse, pColl);
16da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
16db0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d     }.  }.  iDb =
16dc0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
16dd0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
16de0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
16df0 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
16e00 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
16e10 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
16e20 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d  romToken(pObjNam
16e30 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  e);.  zDb = db->
16e40 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
16e50 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
16e60 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
16e70 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
16e80 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
16e90 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
16ea0 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
16eb0 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72  teFree(z);.    r
16ec0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
16ed0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
16ee0 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
16ef0 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
16f00 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  (z);.  if( pInde
16f10 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
16f20 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
16f30 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
16f40 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
16f50 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
16f60 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
16f70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16f80 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
16f90 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
16fa0 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
16fb0 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
16fc0 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
16fd0 65 6e 64 69 66 0a                                endif.