/ Hex Artifact Content
Login

Artifact 55e7e915a538bb25b1b7448cfb9189cccba554b2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 34 32 20 32 30 30 35 2f 30 38 2f 32 30  1.342 2005/08/20
02f0: 20 30 33 3a 30 33 3a 30 34 20 64 72 68 20 45 78   03:03:04 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 7b 0a 20 20 20 20 20      }else{.     
1a40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a50: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1a60: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e  h table: %s", zN
1a70: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1a80: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1a90: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
1aa0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1ab0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
1ac0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1ad0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1ae0: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
1af0: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
1b00: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
1b10: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
1b20: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1b30: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
1b40: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
1b50: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1b60: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
1b70: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
1b80: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
1b90: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
1ba0: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61  r the.** table a
1bb0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  nd the first mat
1bc0: 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72  ching index is r
1bd0: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
1be0: 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75  ecking.** for du
1bf0: 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61  plicate index na
1c00: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
1c10: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
1c20: 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74  is.** TEMP first
1c30: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
1c40: 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  n any auxiliary 
1c50: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a  databases added.
1c60: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ** using the ATT
1c70: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ACH command..*/.
1c80: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69  Index *sqlite3Fi
1c90: 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ndIndex(sqlite3 
1ca0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1cb0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1cc0: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65  ar *zDb){.  Inde
1cd0: 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  x *p = 0;.  int 
1ce0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62  i;.  assert( (db
1cf0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1d00: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c  _Initialized) ||
1d10: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1d20: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
1d30: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
1d40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1d50: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
1d60: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
1d70: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1d80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
1d90: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1da0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
1db0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
1dc0: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
1dd0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
1de0: 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68  ->aDb[j].idxHash
1df0: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
1e00: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69  zName)+1);.    i
1e10: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
1e20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1e30: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
1e40: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
1e50: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
1e60: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
1e70: 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20  dex(Index *p){. 
1e80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
1e90: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
1ea0: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
1eb0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1ec0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1ed0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1ee0: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
1ef0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
1f00: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
1f10: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
1f20: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1f30: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
1f40: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
1f50: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
1f60: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
1f70: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
1f80: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
1f90: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
1fa0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
1fb0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1fc0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1fd0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
1fe0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
1ff0: 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70   *p){.  Index *p
2000: 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Old;..  assert( 
2010: 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d  db!=0 && p->zNam
2020: 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d  e!=0 );.  pOld =
2030: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2040: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
2050: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d 3e  Db].idxHash, p->
2060: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
2090: 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  )+1, 0);.  asser
20a0: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
20b0: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49  ld==p );.  freeI
20c0: 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ndex(p);.}../*.*
20d0: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
20e0: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
20f0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
2100: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
2110: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
2120: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
2130: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
2140: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
2150: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
2160: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
2170: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
2180: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
2190: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
21a0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
21b0: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
21c0: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
21d0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
21e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
21f0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
2200: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20   *pIndex;.  int 
2210: 6c 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  len;..  len = st
2220: 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a  rlen(zIdxName);.
2230: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
2240: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
2250: 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61  ->aDb[iDb].idxHa
2260: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65  sh, zIdxName, le
2270: 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  n+1, 0);.  if( p
2280: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28  Index ){.    if(
2290: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
22a0: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
22b0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
22c0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
22d0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
22e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22f0: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
2300: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
2310: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
2320: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
2330: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
2340: 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70  t){}.      if( p
2350: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
2360: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
2370: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
2380: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
2390: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
23a0: 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
23b0: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
23c0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
23d0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
23e0: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
23f0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
2400: 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  om the in-memory
2410: 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a   hash tables of.
2420: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  ** a single data
2430: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
2440: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2450: 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a   reclaim memory.
2460: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61  ** before the da
2470: 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20  tabase closes.  
2480: 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65  It is also calle
2490: 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  d during a rollb
24a0: 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ack.** if there 
24b0: 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e  were schema chan
24c0: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
24d0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66  ransaction or if
24e0: 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f   a.** schema-coo
24f0: 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63  kie mismatch occ
2500: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  urs..**.** If iD
2510: 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20  b<=0 then reset 
2520: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
2530: 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61  ema tables for a
2540: 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
2550: 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32  iles.  If iDb>=2
2560: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
2570: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
2580: 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  for only the.** 
2590: 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69  single file indi
25a0: 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cated..*/.void s
25b0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
25c0: 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65  nalSchema(sqlite
25d0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
25e0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
25f0: 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31  em;.  Hash temp1
2600: 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a  ;.  Hash temp2;.
2610: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61    int i, j;..  a
2620: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
2630: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
2640: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2650: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
2660: 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b  ed;.  for(i=iDb;
2670: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2680: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
2690: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
26a0: 20 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62   temp1 = pDb->tb
26b0: 6c 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32  lHash;.    temp2
26c0: 20 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68   = pDb->trigHash
26d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
26e0: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67  hInit(&pDb->trig
26f0: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
2700: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
2710: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2720: 61 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b  ar(&pDb->aFKey);
2730: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2740: 43 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48  Clear(&pDb->idxH
2750: 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45  ash);.    for(pE
2760: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2770: 72 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c  rst(&temp2); pEl
2780: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
2790: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
27a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
27b0: 65 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72  eleteTrigger((Tr
27c0: 69 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73  igger*)sqliteHas
27d0: 68 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20  hData(pElem));. 
27e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27f0: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32  HashClear(&temp2
2800: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
2810: 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c  shInit(&pDb->tbl
2820: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
2830: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
2840: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
2850: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
2860: 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p1); pElem; pEle
2870: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2880: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
2890: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
28a0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
28b0: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
28c0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
28d0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
28e0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
28f0: 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20  ear(&temp1);.   
2900: 20 70 44 62 2d 3e 70 53 65 71 54 61 62 20 3d 20   pDb->pSeqTab = 
2910: 30 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72  0;.    DbClearPr
2920: 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42  operty(db, i, DB
2930: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a  _SchemaLoaded);.
2940: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
2950: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
2960: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
2970: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2980: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2990: 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  nges;..  /* If o
29a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
29b0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
29c0: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
29d0: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
29e0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
29f0: 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  n from the auxil
2a00: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
2a10: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
2a20: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
2a30: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
2a40: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
2a50: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
2a60: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
2a70: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
2a80: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
2a90: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
2aa0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
2ab0: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
2ac0: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
2ad0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
2ae0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2af0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
2b00: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
2b10: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
2b20: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2b30: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
2b40: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
2b50: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
2b60: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
2b70: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
2b80: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
2b90: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2ba0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
2bb0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
2bc0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
2bd0: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
2be0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62    sqliteFree(pDb
2bf0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2c00: 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  pDb->zName = 0;.
2c10: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2c20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
2c30: 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  i ){.      db->a
2c40: 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[j] = db->aDb[
2c50: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  i];.    }.    j+
2c60: 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  +;.  }.  memset(
2c70: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20  &db->aDb[j], 0, 
2c80: 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65  (db->nDb-j)*size
2c90: 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b  of(db->aDb[j]));
2ca0: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a  .  db->nDb = j;.
2cb0: 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32    if( db->nDb<=2
2cc0: 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d   && db->aDb!=db-
2cd0: 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20  >aDbStatic ){.  
2ce0: 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62    memcpy(db->aDb
2cf0: 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c  Static, db->aDb,
2d00: 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44   2*sizeof(db->aD
2d10: 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69  b[0]));.    sqli
2d20: 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b  teFree(db->aDb);
2d30: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
2d40: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
2d50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2d60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2d70: 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  d whenever a rol
2d80: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49  lback occurs.  I
2d90: 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20  f there were.** 
2da0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
2db0: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
2dc0: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68  ction, then we h
2dd0: 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  ave to reset the
2de0: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
2df0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c  h tables and rel
2e00: 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69  oad them from di
2e10: 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sk..*/.void sqli
2e20: 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72  te3RollbackInter
2e30: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
2e40: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
2e50: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
2e60: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
2e70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2e80: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2e90: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  a(db, 0);.  }.}.
2ea0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2eb0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2ec0: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
2ed0: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
2ee0: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
2ef0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
2f00: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61   *db){.  db->fla
2f10: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
2f20: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
2f30: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
2f40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
2f50: 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  m a table or vie
2f60: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
2f70: 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c  d sqliteResetCol
2f80: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
2f90: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
2fa0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
2fb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
2fc0: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
2fd0: 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61  pCol = pTable->a
2fe0: 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  Col)!=0 ){.    f
2ff0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
3000: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
3010: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l++){.      sqli
3020: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
3030: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
3040: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
3050: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
3060: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
3070: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a  ->zType);.    }.
3080: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3090: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
30a0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  }.  pTable->aCol
30b0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
30c0: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
30d0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
30e0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
30f0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
3100: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
3110: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
3120: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
3130: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
3140: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
3150: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
3160: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
3170: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
3180: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
3190: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
31a0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
31b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
31c0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
31d0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
31e0: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
31f0: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
3200: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
3210: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
3220: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3230: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
3240: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
3250: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3260: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
3270: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
3280: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3290: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
32a0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
32b0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
32c0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
32d0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
32e0: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
32f0: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
3300: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
3310: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
3320: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
3330: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
3340: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3350: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
3360: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
3370: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64   *pTable){.  Ind
3380: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
3390: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
33a0: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a  y, *pNextFKey;..
33b0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
33c0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
33d0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
33e0: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
33f0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3400: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
3410: 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  */.  pTable->nRe
3420: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  f--;.  if( pTabl
3430: 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  e->nRef>0 ){.   
3440: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3450: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
3460: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
3470: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3480: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3490: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
34a0: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
34b0: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
34c0: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
34d0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
34e0: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
34f0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
3500: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61  pIndex->iDb==pTa
3510: 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61  ble->iDb || (pTa
3520: 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70  ble->iDb==0 && p
3530: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29  Index->iDb==1) )
3540: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3550: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
3560: 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ex);.  }..#ifnde
3570: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3580: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44  REIGN_KEY.  /* D
3590: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
35a0: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
35b0: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
35c0: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
35d0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
35e0: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
35f0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
3600: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
3610: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
3620: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
3630: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
3640: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
3650: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
3660: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
3670: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
3680: 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ->iDb<db->nDb );
3690: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
36a0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
36b0: 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44  ->aDb[pTable->iD
36c0: 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20  b].aFKey,.      
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
36f0: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
3700: 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b  To)+1)!=pFKey );
3710: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3720: 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  pFKey);.  }.#end
3730: 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  if..  /* Delete 
3740: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
3750: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
3760: 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  .  sqliteResetCo
3770: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65  lumnNames(pTable
3780: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3790: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
37a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
37b0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
37c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
37d0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
37e0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
37f0: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
3800: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
3810: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
3820: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3830: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
3840: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
3850: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
3860: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
3870: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
3880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
3890: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
38a0: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
38b0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
38c0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
38d0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b    Table *p;.  FK
38e0: 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20  ey *pF1, *pF2;. 
38f0: 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
3900: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
3910: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
3920: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
3930: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e  .  assert( zTabN
3940: 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b  ame && zTabName[
3950: 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0] );.  pDb = &d
3960: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
3970: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
3980: 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  sert(&pDb->tblHa
3990: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74  sh, zTabName, st
39a0: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31  rlen(zTabName)+1
39b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
39c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
39d0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
39e0: 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  .    for(pF1=p->
39f0: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
3a00: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
3a10: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
3a20: 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f   strlen(pF1->zTo
3a30: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32  ) + 1;.      pF2
3a40: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
3a50: 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  nd(&pDb->aFKey, 
3a60: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  pF1->zTo, nTo);.
3a70: 20 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70        if( pF2==p
3a80: 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  F1 ){.        sq
3a90: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3aa0: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31  &pDb->aFKey, pF1
3ab0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d  ->zTo, nTo, pF1-
3ac0: 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20  >pNextTo);.     
3ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3ae0: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
3af0: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
3b00: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
3b10: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  tTo; }.        i
3b20: 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20  f( pF2 ){.      
3b30: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
3b40: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
3b50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3b60: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
3b70: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
3b80: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
3b90: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3ba0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3bb0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3bc0: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
3bd0: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
3be0: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
3bf0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
3c00: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20  t.** token with 
3c10: 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72  any quotations r
3c20: 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74  emoved.  Space t
3c30: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
3c40: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3c50: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3c60: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
3c70: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
3c80: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
3c90: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
3ca0: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
3cb0: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
3cc0: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
3cd0: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
3ce0: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
3cf0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3d00: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
3d10: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
3d20: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3d30: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3d40: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
3d50: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
3d60: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3d70: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
3d80: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3d90: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3da0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3db0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
3dc0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
3dd0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3de0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
3df0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
3e00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
3e10: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
3e20: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
3e30: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3e40: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3e50: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3e60: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3e70: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3e80: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
3e90: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
3ea0: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
3eb0: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
3ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ed0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3ee0: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
3ef0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3f00: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
3f10: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
3f20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f30: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3f40: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3f50: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3f60: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3f70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3f80: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
3f90: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
3fa0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
3fb0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
3fc0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
3fd0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
3fe0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
3ff0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
4000: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4010: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4020: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4030: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4040: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4050: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
4060: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
4070: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4080: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4090: 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62   -1;    /* Datab
40a0: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
40b0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
40c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
40d0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
40e0: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
40f0: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
4100: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4110: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4120: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4130: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4140: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4150: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
4160: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4170: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4180: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
4190: 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  ){.    n = strle
41a0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
41b0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
41c0: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
41d0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
41e0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
41f0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4200: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74 72  i!=1 ) && n==str
4210: 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  len(pDb->zName) 
4220: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
4230: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
4240: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
4250: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
4260: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4270: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
4280: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  e(zName);.  }.  
4290: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
42a0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
42b0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
42c0: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
42d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
42e0: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
42f0: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4300: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4310: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4320: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4330: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4340: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4350: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
4360: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4370: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
4380: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
4390: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
43a0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
43b0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
43c0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
43d0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
43e0: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
43f0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4400: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4410: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4420: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4430: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4440: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4450: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
4460: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
4470: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
4480: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
4490: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
44a0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
44b0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
44c0: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
44d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
44e0: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
44f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4500: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4510: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4520: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4530: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
4540: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
4550: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4560: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
4570: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
4580: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
4590: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
45a0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
45b0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
45c0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
45d0: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
45e0: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
45f0: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
4620: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
4630: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4640: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
4650: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
4660: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
4670: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
4680: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
4690: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
46a0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
46b0: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
46c0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
46d0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
46e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
46f0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
4700: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
4710: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
4720: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4730: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
4740: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4750: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
4760: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
4770: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
4780: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
4790: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
47a0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
47b0: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
47c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
47d0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
47e0: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
47f0: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
4800: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
4810: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
4820: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
4830: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
4840: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
4850: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
4860: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
4870: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
4880: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
4890: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
48a0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
48b0: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
48c0: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
48d0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
48e0: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
48f0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
4900: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
4910: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
4920: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4940: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
4950: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
4960: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
4970: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
4980: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
4990: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
49a0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
49b0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
49c0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
49d0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
49e0: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
49f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4a00: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
4a10: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
4a20: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
4a30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
4a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4a50: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
4a60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4a70: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
4a80: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
4a90: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
4aa0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
4ab0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
4ac0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
4ad0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
4ae0: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
4af0: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
4b00: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4b10: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
4b20: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
4b30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4b40: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
4b50: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
4b60: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
4b70: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4b80: 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20    The.** pStart 
4b90: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45  token is the CRE
4ba0: 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73  ATE and pName is
4bb0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4bc0: 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20    The isTemp.** 
4bd0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
4be0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
4bf0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
4c00: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
4c10: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
4c20: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
4c30: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
4c40: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
4c50: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
4c60: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
4c70: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
4c80: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
4c90: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
4ca0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
4cb0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
4cc0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
4cd0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
4ce0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
4cf0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
4d00: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
4d10: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
4d20: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
4d30: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
4d40: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
4d50: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
4d60: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
4d70: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
4d80: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
4d90: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4da0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
4db0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
4dc0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
4dd0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
4de0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
4df0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
4e00: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
4e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
4e20: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
4e30: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
4e40: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4e50: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
4e60: 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41  ,   /* The "CREA
4e70: 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54  TE" token */.  T
4e80: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4e90: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
4ea0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4eb0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
4ec0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4ed0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
4ee0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
4ef0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
4f00: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
4f10: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
4f20: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
4f30: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
4f40: 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20  int isView      
4f50: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
4f60: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b   is a VIEW */.){
4f70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
4f80: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
4f90: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
4fa0: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
4fb0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
4fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
4fd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4fe0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
4ff0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
5000: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5010: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
5020: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
5030: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
5040: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
5050: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
5060: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
5070: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5080: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
5090: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
50a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
50b0: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
50c0: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
50d0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
50e0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
50f0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5100: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
5110: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5120: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
5130: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5140: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5150: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5160: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5170: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
5180: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5190: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
51a0: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
51b0: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
51c0: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
51d0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
51e0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
51f0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
5200: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
5210: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
5220: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
5230: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5240: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5250: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
5260: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5270: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5280: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
5290: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
52a0: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
52b0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
52c0: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
52d0: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
52e0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
52f0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
5300: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
5310: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
5320: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
5330: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
5340: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5350: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5360: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
5370: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
5380: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
5390: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
53a0: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
53b0: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
53c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
53d0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
53e0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
53f0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
5400: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5410: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5420: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
5430: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
5440: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
5450: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
5460: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5470: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
5480: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
5490: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
54a0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
54b0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
54c0: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
54d0: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
54e0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
54f0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
5500: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
5510: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
5520: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5530: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
5540: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
5550: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
5560: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
5570: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
5580: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
5590: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
55a0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
55b0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
55c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
55d0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
55e0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
55f0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5600: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
5610: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
5620: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5630: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
5640: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5650: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
5660: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5670: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5680: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
5690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
56a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
56b0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
56c0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
56d0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
56e0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
56f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5700: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5710: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
5720: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
5730: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5740: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
5750: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
5760: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
5770: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5780: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
5790: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
57a0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
57b0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
57c0: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
57d0: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
57e0: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
57f0: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
5800: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
5810: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
5820: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
5830: 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
5840: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5850: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
5860: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
5870: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5880: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
5890: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
58a0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
58b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
58c0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
58d0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
58e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
58f0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
5900: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
5910: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  e);.    goto beg
5920: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5930: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
5940: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
5950: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
5960: 29 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 28  )!=0 && .      (
5970: 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e   iDb==0 || !db->
5980: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
5990: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
59a0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
59b0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
59c0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
59d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
59e0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
59f0: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5a00: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5a10: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
5a20: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
5a30: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
5a40: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
5a50: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
5a60: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
5a70: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5a80: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5a90: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
5aa0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
5ab0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
5ac0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
5ad0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
5ae0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
5af0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
5b00: 44 62 20 3d 20 69 44 62 3b 0a 20 20 70 54 61 62  Db = iDb;.  pTab
5b10: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
5b20: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
5b30: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
5b40: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5b50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5b60: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
5b70: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
5b80: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5b90: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
5ba0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
5bb0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
5bc0: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
5bd0: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
5be0: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
5bf0: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
5c00: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
5c10: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
5c20: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
5c30: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
5c40: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5c50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
5c60: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
5c70: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
5c80: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
5c90: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
5ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  ==0 ){.    db->a
5cb0: 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20  Db[iDb].pSeqTab 
5cc0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
5cd0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
5ce0: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
5cf0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
5d00: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
5d10: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
5d20: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
5d30: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
5d40: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
5d50: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
5d60: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
5d70: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
5d80: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5d90: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
5da0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
5db0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
5dc0: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
5dd0: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
5de0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
5df0: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
5e00: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
5e10: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
5e20: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
5e30: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
5e40: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
5e50: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
5e60: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
5e70: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
5e80: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
5e90: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
5ea0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
5eb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
5ec0: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
5ed0: 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20      int lbl;.   
5ee0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
5ef0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
5f00: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
5f10: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
5f20: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
5f30: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
5f40: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
5f50: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
5f60: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
5f70: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
5f80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5f90: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
5fa0: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
5fb0: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62 6c  ormat */.    lbl
5fc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
5fd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
5fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ff0: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62  (v, OP_If, 0, lb
6000: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
6010: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6020: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
6030: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
6040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6050: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6060: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
6070: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6080: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6090: 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20  db->enc, 0);.   
60a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
60b0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
60c0: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
60d0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
60e0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
60f0: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6100: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6110: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6120: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6130: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6140: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6150: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6160: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6170: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6180: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6190: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
61a0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
61b0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
61c0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
61d0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
61e0: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
61f0: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6200: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6210: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6220: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6230: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6240: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6250: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
6260: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
6270: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
6280: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
6290: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
62a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
62b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
62c0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
62d0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
62e0: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
62f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6300: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
6310: 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  Db, 0);.    }.  
6320: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
6330: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29  terTable(v, iDb)
6340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
6360: 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Rowid, 0, 0);.  
6370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6380: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
6390: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
63a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
63b0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
63c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63d0: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
63e0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
63f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6400: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6420: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
6430: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
6440: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
6450: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
6460: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
6470: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6480: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
6490: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
64a0: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46  error:.  sqliteF
64b0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
64c0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
64d0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
64e0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f  d to compare two
64f0: 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61   strings in a ca
6500: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
6510: 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20  anner..** It is 
6520: 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
6530: 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c  than calling sql
6540: 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69  ite3StrICmp() di
6550: 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70  rectly, but.** p
6560: 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63  roduces larger c
6570: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  ode..**.** WARNI
6580: 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  NG: This macro i
6590: 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65  s not compatible
65a0: 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70   with the strcmp
65b0: 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a  () family. It.**
65c0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
65d0: 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73   the two strings
65e0: 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65   are equal, othe
65f0: 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  rwise false..*/.
6600: 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28  #define STRICMP(
6610: 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33  x, y) (\.sqlite3
6620: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
6630: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
6640: 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65  x)]==   \.sqlite
6650: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
6660: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6670: 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71  (y)]     \.&& sq
6680: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29  lite3StrICmp((x)
6690: 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a  +1,(y)+1)==0 )..
66a0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
66b0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
66c0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
66d0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
66e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
66f0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
6700: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
6710: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
6720: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
6730: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6740: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
6750: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
6760: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
6770: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
6780: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
6790: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
67a0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
67b0: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
67c0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
67d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
67e0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
67f0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6800: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43  ;.  char *z;.  C
6810: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
6820: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
6830: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6840: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
6850: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
6860: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
6870: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
6880: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6890: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
68a0: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
68b0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
68c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
68d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
68e0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
68f0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
6900: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
6910: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
6920: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
6930: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
6940: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
6950: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
6960: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
6970: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
6980: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
6990: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
69a0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
69b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
69c0: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
69d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
69e0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
69f0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
6a00: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
6a10: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
6a20: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
6a30: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
6a40: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
6a50: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
6a60: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
6a70: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
6a80: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
6a90: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
6aa0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
6ab0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
6ac0: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
6ad0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
6ae0: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
6af0: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
6b00: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
6b10: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
6b20: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
6b30: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
6b40: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
6b50: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
6b60: 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  oll;.  p->nCol++
6b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6b80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6b90: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
6ba0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
6bb0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
6bc0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
6bd0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
6be0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
6bf0: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
6c00: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
6c10: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
6c20: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
6c30: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
6c40: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
6c50: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6c60: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
6c70: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
6c80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
6c90: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
6ca0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6cb0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6cc0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6cd0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6ce0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
6cf0: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
6d00: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
6d10: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
6d20: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
6d30: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
6d40: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
6d50: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
6d60: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
6d70: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
6d80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6d90: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
6da0: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
6db0: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
6dc0: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
6dd0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
6de0: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
6df0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
6e00: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
6e10: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
6e20: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
6e30: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
6e40: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
6e50: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
6e60: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
6e70: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
6e80: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
6e90: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
6ea0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
6eb0: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
6ec0: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
6ed0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
6ee0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
6ef0: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
6f00: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
6f30: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
6f40: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
6f50: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
6f60: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
6f70: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
6f80: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
6f90: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
6fa0: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
6fb0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
6fc0: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
6fd0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
6fe0: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
6ff0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7000: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
7010: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
7020: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7030: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7040: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
7050: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
7060: 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  t Token *pType){
7070: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
7080: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
7090: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
70a0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
70b0: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70  char *zIn = pTyp
70c0: 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  e->z;.  const un
70d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e  signed char *zEn
70e0: 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54  d = &pType->z[pT
70f0: 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c  ype->n];..  whil
7100: 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a  e( zIn!=zEnd ){.
7110: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
7120: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
7130: 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20  ower[*zIn];.    
7140: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
7150: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
7160: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
7170: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
7180: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
7190: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
71a0: 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20  E_AFF_TEXT; .   
71b0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
71c0: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
71d0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
71e0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
71f0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
7200: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7210: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7220: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
7230: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
7240: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
7250: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
7260: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7270: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7280: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
7290: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
72a0: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
72b0: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
72c0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
72d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
72e0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
72f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
7300: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7310: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
7320: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
7330: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
7340: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
7350: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7360: 49 4e 54 45 47 45 52 3b 20 0a 20 20 20 20 20 20  INTEGER; .      
7370: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
7380: 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ..  return aff;.
7390: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
73a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
73b0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
73c0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
73d0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
73e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
73f0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
7400: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
7410: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
7420: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
7430: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
7440: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
7450: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
7460: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
7470: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
7480: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
7490: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
74a0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
74b0: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
74c0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
74d0: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
74e0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
74f0: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
7500: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
7510: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
7520: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
7530: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
7540: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
7550: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
7560: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
7570: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  p;.  int i;.  Co
7580: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  lumn *pCol;..  i
7590: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
75a0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
75b0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
75c0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
75d0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
75e0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69  Col = &p->aCol[i
75f0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  ];.  assert( pCo
7600: 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20  l->zType==0 );. 
7610: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
7620: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
7630: 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20 20 70 43  ken(pType);.  pC
7640: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
7650: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
7660: 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  pe(pType);.}../*
7670: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
7680: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
7690: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
76a0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
76b0: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
76c0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
76d0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
76e0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
76f0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
7700: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
7710: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
7720: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
7730: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
7740: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
7750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7760: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7770: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7780: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7790: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
77a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
77b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
77c0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
77d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
77e0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
77f0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
7800: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
7810: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7820: 77 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20  wTable)!=0 ){.  
7830: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
7840: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
7850: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
7860: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
7870: 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20  Function(pExpr) 
7880: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7890: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
78a0: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
78b0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
78c0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
78d0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
78e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
78f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7900: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
7910: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
7920: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
7930: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78  lite3ExprDup(pEx
7940: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
7950: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7960: 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  te(pExpr);.}../*
7970: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
7980: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
7990: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
79a0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
79b0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
79c0: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
79d0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
79e0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
79f0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
7a00: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
7a10: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
7a20: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
7a30: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
7a40: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
7a50: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
7a60: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
7a70: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
7a80: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
7a90: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
7aa0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
7ab0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
7ac0: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
7ad0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
7ae0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
7af0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
7b00: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
7b10: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
7b20: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
7b30: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
7b40: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
7b50: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
7b60: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
7b70: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
7b80: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
7b90: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
7ba0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
7bb0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
7bc0: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
7bd0: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
7be0: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
7bf0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
7c00: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
7c10: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
7c20: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
7c30: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
7c40: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
7c50: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
7c60: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
7c70: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
7c80: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7c90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7ca0: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
7cb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7cc0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
7cd0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
7ce0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
7cf0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
7d00: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
7d10: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
7d20: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
7d30: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
7d40: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
7d50: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
7d60: 6f 49 6e 63 20 20 20 20 20 20 20 2f 2a 20 54 72  oInc       /* Tr
7d70: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
7d80: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
7d90: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b  is present */.){
7da0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
7db0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7dc0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
7dd0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
7de0: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28  l = -1, i;.  if(
7df0: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
7e00: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
7e10: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61  ;.  if( pTab->ha
7e20: 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20  sPrimKey ){.    
7e30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7e40: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
7e50: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
7e60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
7e70: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
7e80: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
7e90: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
7ea0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
7eb0: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
7ec0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
7ed0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
7ee0: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
7ef0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
7f00: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
7f10: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7f20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
7f30: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7f40: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
7f50: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
7f60: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
7f70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
7f80: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
7f90: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
7fa0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
7fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7fd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7fe0: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
7ff0: 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c  Col ) pTab->aCol
8000: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
8010: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8020: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
8030: 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  >1 ) iCol = -1;.
8040: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
8050: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
8060: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
8070: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
8080: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
8090: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73    if( zType && s
80a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
80b0: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
80c0: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  =0 ){.    pTab->
80d0: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
80e0: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
80f0: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70  = onError;.    p
8100: 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61  Tab->autoInc = a
8110: 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20  utoInc;.  }else 
8120: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
8130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8140: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
8150: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8160: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
8170: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
8180: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
8190: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
81a0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
81b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
81c0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
81d0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
81e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
81f0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29  , onError, 0, 0)
8200: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
8210: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
8220: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
8230: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8240: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
8250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8260: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
8270: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
8280: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
8290: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
82a0: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
82b0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
82c0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
82d0: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
82e0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
82f0: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
8300: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8310: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8320: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
8330: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
8340: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8350: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8360: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
8370: 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20  Col-1;..  pColl 
8380: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
8390: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
83a0: 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20  Type, nType);.  
83b0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c  p->aCol[i].pColl
83c0: 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20   = pColl;..  /* 
83d0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
83e0: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
83f0: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
8400: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
8410: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69  ,.  ** then an i
8420: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
8430: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
8440: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
8450: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74   the.  ** collat
8460: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
8470: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
8480: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
8490: 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  se..  */.  for(p
84a0: 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b  Idx = p->pIndex;
84b0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
84c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73  ->pNext){.    as
84d0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
84e0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  umn==1 );.    if
84f0: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
8500: 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b  [0]==i ) pIdx->k
8510: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
8520: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a  = pColl;.  }.}..
8530: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
8540: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29  e3CheckCollSeq()
8550: 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69   for all collati
8560: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20  ng sequences in 
8570: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20  an index,.** in 
8580: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20  order to verify 
8590: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63  that all the nec
85a0: 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67  essary collating
85b0: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a   sequences are.*
85c0: 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74  * loaded..*/.int
85d0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64   sqlite3CheckInd
85e0: 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  exCollSeq(Parse 
85f0: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
8600: 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64  pIdx){.  if( pId
8610: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  x ){.    int i;.
8620: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8630: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
8640: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8650: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
8660: 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  q(pParse, pIdx->
8670: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
8680: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
8690: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
86a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
86b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
86c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
86d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
86e0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
86f0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
8700: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
8710: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
8720: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
8730: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
8740: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
8750: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
8760: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
8770: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
8780: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
8790: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
87a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
87b0: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
87c0: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
87d0: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
87e0: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
87f0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
8800: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
8810: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
8820: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
8830: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
8840: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
8850: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
8860: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
8870: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
8880: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
8890: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
88a0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
88b0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
88c0: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
88d0: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
88e0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
88f0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
8900: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
8910: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
8920: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
8930: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
8940: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
8950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
8960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8970: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
8980: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8990: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65  arse->db;.  u8 e
89a0: 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20  nc = db->enc;.  
89b0: 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62  u8 initbusy = db
89c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 0a 20 20  ->init.busy;..  
89d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
89e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
89f0: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
8a00: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62  me, nName, initb
8a10: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
8a20: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
8a30: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
8a40: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
8a50: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
8a60: 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  eq(db, pColl, zN
8a70: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
8a80: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
8a90: 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30       if( nName<0
8aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d   ){.        nNam
8ab0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
8ac0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8ad0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8ae0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
8af0: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
8b00: 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61  ence: %.*s", nNa
8b10: 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
8b20: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    pColl = 0;.   
8b30: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8b40: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
8b50: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8b60: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
8b70: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
8b80: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
8b90: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
8ba0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
8bb0: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
8bc0: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
8bd0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
8be0: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
8bf0: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
8c00: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
8c10: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
8c20: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
8c30: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
8c40: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
8c50: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
8c60: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
8c70: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
8c80: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
8c90: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
8ca0: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
8cb0: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
8cc0: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
8cd0: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
8ce0: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
8cf0: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
8d00: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
8d10: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
8d20: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
8d30: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
8d40: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
8d50: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
8d60: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
8d70: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
8d80: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
8d90: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
8da0: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
8db0: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
8dc0: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
8dd0: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
8de0: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
8df0: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
8e00: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
8e10: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
8e20: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
8e30: 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64  ookie(sqlite3 *d
8e40: 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  b, Vdbe *v, int 
8e50: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  iDb){.  sqlite3V
8e60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
8e70: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
8e80: 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
8e90: 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  ie+1, 0);.  sqli
8ea0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8eb0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
8ec0: 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, 0);.}../*.** 
8ed0: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
8ee0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
8ef0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
8f00: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
8f10: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
8f20: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
8f30: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
8f40: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
8f50: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
8f60: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
8f70: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
8f80: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
8f90: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
8fa0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
8fb0: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
8fc0: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
8fd0: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
8fe0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
8ff0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
9000: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
9010: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
9020: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
9030: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
9040: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
9050: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
9060: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
9070: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
9080: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
9090: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
90a0: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
90b0: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
90c0: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
90d0: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
90e0: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
90f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
9100: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
9110: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
9120: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
9130: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
9140: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
9150: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
9160: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
9170: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
9180: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
9190: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
91a0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
91b0: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
91c0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
91d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
91e0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
91f0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
9200: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
9210: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
9220: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
9230: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
9240: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
9250: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
9260: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
9270: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
9280: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
9290: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
92a0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
92b0: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
92c0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
92d0: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
92e0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
92f0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
9300: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
9310: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
9320: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
9330: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
9340: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
9350: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9360: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
9370: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
9380: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9390: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
93a0: 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65  eTableStmt(Table
93b0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
93c0: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
93d0: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
93e0: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
93f0: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
9400: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
9410: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
9420: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
9430: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
9440: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
9450: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
9460: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
9470: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
9480: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
9490: 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31  = (strlen(z) + 1
94a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
94b0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
94c0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
94d0: 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<50 ){.    zSe
94e0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
94f0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
9500: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
9510: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
9520: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
9530: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
9540: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
9550: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
9560: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
9570: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
9580: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
9590: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  mt==0 ) return 0
95a0: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74  ;.  strcpy(zStmt
95b0: 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26  , !OMIT_TEMPDB&&
95c0: 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45  p->iDb==1 ? "CRE
95d0: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
95e0: 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22  :"CREATE TABLE "
95f0: 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28  );.  k = strlen(
9600: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
9610: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
9620: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
9630: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
9640: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
9650: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
9660: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
9670: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
9680: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
9690: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
96a0: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
96b0: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
96c0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
96d0: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
96e0: 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f      if( (z = pCo
96f0: 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a  l->zType)!=0 ){.
9700: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
9710: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74   = ' ';.      st
9720: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
9730: 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  z);.      k += s
9740: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a  trlen(z);.    }.
9750: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53    }.  strcpy(&zS
9760: 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20  tmt[k], zEnd);. 
9770: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
9780: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9790: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
97a0: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
97b0: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
97c0: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
97d0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
97e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
97f0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
9800: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
9810: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
9820: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
9830: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
9840: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
9850: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
9860: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
9870: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
9880: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
9890: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
98a0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
98b0: 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65  le on disk, unle
98c0: 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20  ss.** this is a 
98d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
98e0: 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  or db->init.busy
98f0: 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69  ==1.  When db->i
9900: 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69  nit.busy==1.** i
9910: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
9920: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
9930: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
9940: 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a  ecause we just.*
9950: 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74  * connected to t
9960: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62  he database or b
9970: 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74  ecause the sqlit
9980: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68  e_master table h
9990: 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63  as.** recently c
99a0: 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65  hanged, so the e
99b0: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
99c0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
99d0: 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c  ts in.** the sql
99e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
99f0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  .  We do not wan
9a00: 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61  t to create it a
9a10: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gain..**.** If t
9a20: 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d  he pSelect argum
9a30: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
9a40: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
9a50: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
9a60: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  as called to cre
9a70: 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65  ate a table gene
9a80: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a  rated from a .**
9a90: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e   "CREATE TABLE .
9aa0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  .. AS SELECT ...
9ab0: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  " statement.  Th
9ac0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
9ad0: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62  f.** the new tab
9ae0: 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68  le will match th
9af0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9b00: 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
9b10: 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61  oid sqlite3EndTa
9b20: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
9b30: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9b40: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
9b50: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e  */.  Token *pCon
9b60: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
9b70: 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66  The ',' token af
9b80: 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  ter the last col
9b90: 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54  umn defn. */.  T
9ba0: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
9bb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
9bc0: 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e  nal ')' token in
9bd0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
9be0: 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  E */.  Select *p
9bf0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
9c00: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
9c10: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
9c20: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
9c30: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
9c40: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9c50: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
9c60: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
9c70: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
9c80: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
9c90: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
9ca0: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
9cb0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9cc0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
9cd0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
9ce0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
9cf0: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
9d00: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
9d10: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
9d20: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
9d30: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
9d40: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
9d50: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
9d60: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
9d70: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
9d80: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
9d90: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
9da0: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
9db0: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
9dc0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
9dd0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
9de0: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
9df0: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
9e00: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
9e10: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
9e20: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
9e30: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
9e40: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
9e50: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
9e60: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
9e70: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
9e80: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
9e90: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
9ea0: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
9eb0: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
9ec0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
9ed0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
9ee0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
9ef0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
9f00: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
9f10: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
9f20: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
9f30: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
9f40: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
9f50: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
9f60: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
9f70: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
9f80: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
9f90: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
9fa0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
9fb0: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
9fc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
9fd0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
9fe0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
9ff0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
a000: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
a010: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
a020: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
a030: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
a040: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
a050: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
a060: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
a070: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
a080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
a090: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
a0a0: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
a0b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
a0c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
a0d0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
a0e0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
a0f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a100: 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  se, 0, 0);..    
a110: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
a120: 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  otpage for the n
a130: 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73  ew table and pus
a140: 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  h it onto the st
a150: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69  ack..    ** A vi
a160: 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61  ew has no rootpa
a170: 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68  ge, so just push
a180: 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65   a zero onto the
a190: 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a   stack for.    *
a1a0: 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61  * views.  Initia
a1b0: 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68  lize zType at th
a1c0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
a1d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
a1e0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
a1f0: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
a200: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
a210: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
a220: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
a230: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
a240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
a250: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a260: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
a270: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
a280: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
a290: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
a2a0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
a2b0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
a2c0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
a2d0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
a2e0: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
a2f0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
a300: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
a310: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
a320: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
a330: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
a340: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20  new table is on 
a350: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76  the top of the v
a360: 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  dbe stack..    *
a370: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
a380: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
a390: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
a3a0: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
a3b0: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
a3c0: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
a3d0: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
a3e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
a3f0: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
a400: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
a410: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  w table..    */.
a420: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
a430: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
a440: 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73  pSelTab;.      s
a450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a460: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
a470: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a480: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a490: 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20  nteger, p->iDb, 
a4a0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a4b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a4c0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
a4d0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
a4e0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
a4f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
a500: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
a510: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
a520: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
a530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a540: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  p(v, OP_Close, 1
a550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
a560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
a570: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
a580: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
a590: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
a5a0: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74  arse, 0, pSelect
a5b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a5c0: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
a5d0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
a5e0: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
a5f0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
a600: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
a610: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
a620: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
a630: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
a640: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
a650: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
a660: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
a670: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
a680: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
a690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a6a0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
a6b0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
a6c0: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
a6d0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
a6e0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
a6f0: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
a700: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29  eateTableStmt(p)
a710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a720: 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d     n = pEnd->z -
a730: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
a740: 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20  ken.z + 1;.     
a750: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
a760: 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 20  MPrintf("CREATE 
a770: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
a780: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
a790: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
a7a0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
a7b0: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
a7c0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
a7d0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
a7e0: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
a7f0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
a800: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
a810: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
a820: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
a830: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
a840: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
a850: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  .  The rowid for
a860: 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65   the preallocate
a870: 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  d.    ** slot is
a880: 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e   the 2nd item on
a890: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
a8a0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
a8b0: 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  k is the.    ** 
a8c0: 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68  root page for th
a8d0: 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20  e new table (or 
a8e0: 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20 61  a 0 if this is a
a8f0: 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20   view)..    */. 
a900: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
a910: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
a920: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
a930: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
a940: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
a950: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
a960: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20  Q, rootpage=#0, 
a970: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
a980: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22  "WHERE rowid=#1"
a990: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
a9a0: 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  p->iDb].zName, S
a9b0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e 69  CHEMA_TABLE(p->i
a9c0: 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65  Db),.      zType
a9d0: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
a9e0: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
a9f0: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20  ,.      zStmt.  
aa00: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46    );.    sqliteF
aa10: 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20  ree(zStmt);.    
aa20: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
aa30: 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44  kie(db, v, p->iD
aa40: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
aa50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
aa60: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
aa70: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
aa80: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
aa90: 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
aaa0: 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
aab0: 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
aac0: 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
aad0: 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
aae0: 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 49      if( p->autoI
aaf0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nc ){.      Db *
ab00: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
ab10: 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  ->iDb];.      if
ab20: 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62 3d 3d  ( pDb->pSeqTab==
ab30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
ab40: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
ab50: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
ab60: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
ab70: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
ab80: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
ab90: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
aba0: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
abb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
abc0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
abd0: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
abe0: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
abf0: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
ac00: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
ac10: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ac20: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 70  P_ParseSchema, p
ac30: 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20  ->iDb, 0,.      
ac40: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
ac50: 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22  ("tbl_name='%q'"
ac60: 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44  ,p->zName), P3_D
ac70: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20  YNAMIC);.  }... 
ac80: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
ac90: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
aca0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
acb0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
acc0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
acd0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
ace0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
acf0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
ad00: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
ad10: 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62  ey; .    Db *pDb
ad20: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69   = &db->aDb[p->i
ad30: 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Db];.    pOld = 
ad40: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
ad50: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
ad60: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
ad70: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
ad80: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
ad90: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
ada0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
adb0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
adc0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
add0: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
ade0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
adf0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
ae00: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
ae10: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79  EY.    for(pFKey
ae20: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
ae30: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
ae40: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
ae50: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
ae60: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
ae70: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
ae80: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
ae90: 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e  3HashFind(&pDb->
aea0: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
aeb0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
aec0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
aed0: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
aee0: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
aef0: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  FKey);.    }.#en
af00: 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  dif.    pParse->
af10: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
af20: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
af30: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
af40: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
af50: 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66  hanges;..#ifndef
af60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
af70: 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
af80: 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
af90: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
afa0: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
afb0: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
afc0: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
afd0: 29 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a  ) pCons = pEnd;.
afe0: 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
aff0: 66 66 73 65 74 20 3d 20 31 33 20 2b 20 28 70 43  ffset = 13 + (pC
b000: 6f 6e 73 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  ons->z - pParse-
b010: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
b020: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
b030: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b040: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
b050: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
b060: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
b070: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
b080: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
b090: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
b0a0: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
b0b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
b0c0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
b0d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
b0e0: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
b0f0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
b100: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
b110: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
b120: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
b130: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
b140: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
b150: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
b160: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
b170: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
b180: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
b190: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b1a0: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
b1b0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
b1c0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
b1d0: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
b1e0: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
b1f0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
b200: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p         /* TRU
b210: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
b220: 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  Y view */.){.  T
b230: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
b240: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
b250: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  ed char *z;.  To
b260: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
b270: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
b280: 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 69 66 28  n *pName;..  if(
b290: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
b2a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b2b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b2c0: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
b2d0: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
b2e0: 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
b2f0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
b300: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
b310: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
b320: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
b330: 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61  rse, pBegin, pNa
b340: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54  me1, pName2, isT
b350: 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70  emp, 1);.  p = p
b360: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b370: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
b380: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
b390: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b3a0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
b3b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b3c0: 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  }.  sqlite3TwoPa
b3d0: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
b3e0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
b3f0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
b400: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
b410: 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69  ix, pParse, p->i
b420: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
b430: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
b440: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
b450: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
b460: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b470: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
b480: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b490: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
b4a0: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
b4b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
b4c0: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
b4d0: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
b4e0: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
b4f0: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
b500: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
b510: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
b520: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
b530: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
b540: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
b550: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
b560: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
b570: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
b580: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
b590: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
b5a0: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
b5b0: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
b5c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b5d0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
b5e0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
b5f0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
b600: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
b610: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
b620: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
b630: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
b640: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
b650: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
b660: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
b670: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
b680: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
b690: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
b6a0: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
b6b0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
b6c0: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
b6d0: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
b6e0: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
b6f0: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
b700: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
b710: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
b720: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
b730: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
b740: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
b750: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
b760: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
b770: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
b780: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
b790: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
b7a0: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
b7b0: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
b7c0: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
b7d0: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
b7e0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
b7f0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
b800: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
b810: 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20   0, &sEnd, 0);. 
b820: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
b830: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b840: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
b850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b860: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  EW./*.** The Tab
b870: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
b880: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
b890: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
b8a0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
b8b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
b8c0: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
b8d0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
b8e0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
b8f0: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
b900: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
b910: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
b920: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
b930: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
b940: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
b950: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
b960: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
b970: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
b980: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
b990: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
b9a0: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
b9b0: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
b9c0: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
b9d0: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
b9e0: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
b9f0: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
ba00: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
ba10: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
ba20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ba30: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
ba40: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
ba50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
ba60: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
ba70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
ba80: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
ba90: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
baa0: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
bab0: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
bac0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
bad0: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
bae0: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
baf0: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
bb00: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
bb10: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
bb20: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
bb30: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
bb40: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
bb50: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
bb60: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
bb70: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
bb80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
bb90: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
bba0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
bbb0: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
bbc0: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
bbd0: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
bbe0: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
bbf0: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
bc00: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
bc10: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
bc20: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
bc30: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
bc40: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
bc50: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
bc60: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
bc70: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
bc80: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
bc90: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
bca0: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
bcb0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
bcc0: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
bcd0: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
bce0: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
bcf0: 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  e..  */.#if 0.  
bd00: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
bd10: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
bd20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bd30: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
bd40: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
bd50: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
bd60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
bd70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
bd80: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
bd90: 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
bda0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
bdb0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
bdc0: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
bdd0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
bde0: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
bdf0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
be00: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
be10: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
be20: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
be30: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
be40: 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
be50: 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
be60: 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
be70: 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
be80: 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
be90: 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
bea0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
beb0: 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
bec0: 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
bed0: 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
bee0: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
bef0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
bf00: 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
bf10: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
bf20: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
bf30: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
bf40: 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
bf50: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
bf60: 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53  ctDup(pTable->pS
bf70: 65 6c 65 63 74 29 3b 0a 20 20 6e 20 3d 20 70 50  elect);.  n = pP
bf80: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73 71  arse->nTab;.  sq
bf90: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
bfa0: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
bfb0: 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
bfc0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
bfd0: 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20  -1;.  pSelTab = 
bfe0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
bff0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
c000: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 70 50 61   0, pSel);.  pPa
c010: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
c020: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
c030: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
c040: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
c050: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
c060: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
c070: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
c080: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
c090: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
c0a0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
c0b0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
c0c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
c0d0: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
c0e0: 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ab);.    DbSetPr
c0f0: 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64  operty(pParse->d
c100: 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20  b, pTable->iDb, 
c110: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
c120: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c130: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
c140: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
c150: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
c160: 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20  Delete(pSel);.  
c170: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
c180: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c190: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
c1a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c1b0: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
c1c0: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
c1d0: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
c1e0: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
c1f0: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
c200: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
c210: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
c220: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
c230: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
c240: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
c250: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
c260: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
c270: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
c280: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
c290: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
c2a0: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
c2b0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
c2c0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
c2d0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c2e0: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
c2f0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
c300: 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74       sqliteReset
c310: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62  ColumnNames(pTab
c320: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  );.    }.  }.  D
c330: 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
c340: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
c350: 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
c360: 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
c370: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
c380: 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
c390: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
c3a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c3b0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
c3c0: 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
c3d0: 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
c3e0: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
c3f0: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
c400: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
c410: 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
c420: 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
c430: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
c440: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
c450: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
c460: 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
c470: 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
c480: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
c490: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c4a0: 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
c4b0: 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20  ootPageMoved(Db 
c4c0: 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  *pDb, int iFrom,
c4d0: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
c4e0: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
c4f0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
c500: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
c510: 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c  b->tblHash); pEl
c520: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
c530: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
c540: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
c550: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
c560: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
c570: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
c580: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
c590: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
c5a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c5b0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45    }.  }.  for(pE
c5c0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
c5d0: 72 73 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73  rst(&pDb->idxHas
c5e0: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
c5f0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
c600: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
c610: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
c620: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
c630: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
c640: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
c650: 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
c660: 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74  = iTo;.      ret
c670: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
c680: 20 61 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65   assert(0);.}.#e
c690: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
c6a0: 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
c6b0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
c6c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
c6d0: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
c6e0: 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
c6f0: 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
c700: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
c710: 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
c720: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
c730: 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
c740: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
c750: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
c760: 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
c770: 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
c780: 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
c790: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
c7a0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
c7b0: 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
c7c0: 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
c7d0: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
c7e0: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
c7f0: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
c800: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
c810: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73  dbe(pParse);.  s
c820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c830: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
c840: 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66  Table, iDb);.#if
c850: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c860: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
c870: 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68   OP_Destroy push
c880: 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e  es an integer on
c890: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  to the stack. If
c8a0: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
c8b0: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
c8c0: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
c8d0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
c8e0: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
c8f0: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
c900: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
c910: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
c920: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
c930: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
c940: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
c950: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
c960: 65 20 22 23 30 22 20 69 6e 20 74 68 65 20 53 51  e "#0" in the SQ
c970: 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
c980: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
c990: 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
c9a0: 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65  e.  ** is on the
c9b0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
c9c0: 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 52  k.  See sqlite3R
c9d0: 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20  egisterExpr().. 
c9e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
c9f0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
ca00: 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
ca10: 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
ca20: 65 3d 25 64 20 57 48 45 52 45 20 23 30 20 41 4e  e=%d WHERE #0 AN
ca30: 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a  D rootpage=#0",.
ca40: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
ca50: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
ca60: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
ca70: 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e  b), iTable);.#en
ca80: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  dif.}../*.** Wri
ca90: 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
caa0: 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
cab0: 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
cac0: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
cad0: 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
cae0: 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
caf0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
cb00: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
cb10: 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
cb20: 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
cb30: 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
cb40: 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
cb50: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
cb60: 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
cb70: 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
cb80: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
cb90: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
cba0: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
cbb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
cbc0: 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
cbd0: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
cbe0: 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
cbf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
cc00: 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
cc10: 49 64 78 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  Idx;.  destroyRo
cc20: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
cc30: 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  Tab->tnum, pTab-
cc40: 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64  >iDb);.  for(pId
cc50: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
cc60: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
cc70: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73  >pNext){.    des
cc80: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
cc90: 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  rse, pIdx->tnum,
cca0: 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d   pIdx->iDb);.  }
ccb0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
ccc0: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
ccd0: 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
cce0: 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
ccf0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
cd00: 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
cd10: 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
cd20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
cd30: 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
cd40: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
cd50: 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
cd60: 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
cd70: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
cd80: 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
cd90: 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
cda0: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
cdb0: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
cdc0: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
cdd0: 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
cde0: 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
cdf0: 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
ce00: 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
ce10: 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
ce20: 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
ce30: 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
ce40: 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
ce50: 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
ce60: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
ce70: 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
ce80: 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
ce90: 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
cea0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
ceb0: 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
cec0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
ced0: 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
cee0: 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
cef0: 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
cf00: 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
cf10: 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
cf20: 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
cf30: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
cf40: 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
cf50: 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
cf60: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
cf70: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
cf80: 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
cf90: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
cfa0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
cfb0: 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
cfc0: 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
cfd0: 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
cfe0: 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
cff0: 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
d000: 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
d010: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
d020: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d030: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d040: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
d050: 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
d060: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
d070: 72 74 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70  rt( pIdx->iDb==p
d080: 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20  Tab->iDb );.    
d090: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
d0a0: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
d0b0: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
d0c0: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
d0d0: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
d0e0: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
d0f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
d100: 61 72 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75  argest==0 ) retu
d110: 72 6e 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  rn;.    destroyR
d120: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
d130: 69 4c 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e  iLargest, pTab->
d140: 69 44 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72  iDb);.    iDestr
d150: 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
d160: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
d170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d180: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
d190: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
d1a0: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
d1b0: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
d1c0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d1d0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
d1e0: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
d1f0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
d200: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d210: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
d220: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
d230: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
d240: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
d250: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d260: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
d270: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
d280: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
d290: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
d2a0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
d2b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
d2c0: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
d2d0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
d2e0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
d2f0: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
d300: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
d310: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
d320: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
d330: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
d340: 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62  le;.  iDb = pTab
d350: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
d360: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
d370: 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65  b->nDb );.#ifnde
d380: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d390: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
d3a0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
d3b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
d3c0: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
d3d0: 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  E(pTab->iDb);.  
d3e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
d3f0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
d400: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
d410: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
d420: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
d430: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
d440: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
d450: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
d460: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
d470: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
d480: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
d490: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
d4a0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
d4b0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
d4c0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
d4d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d4e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
d4f0: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
d500: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d510: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
d520: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
d530: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
d540: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
d550: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
d560: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
d570: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
d580: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
d590: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
d5a0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
d5b0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
d5c0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
d5d0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
d5e0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
d5f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
d600: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
d610: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
d620: 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
d630: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
d640: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
d650: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
d660: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
d670: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
d680: 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62  || pTab==db->aDb
d690: 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20 29 7b  [iDb].pSeqTab ){
d6a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d6b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
d6c0: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
d6d0: 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
d6e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
d6f0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
d700: 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
d710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d720: 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
d730: 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
d740: 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
d750: 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
d760: 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
d770: 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
d780: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
d790: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
d7a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d7b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d7c0: 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
d7d0: 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
d7e0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
d7f0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
d800: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
d810: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
d820: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
d830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d840: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d850: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
d860: 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
d870: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
d880: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
d890: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
d8a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
d8b0: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
d8c0: 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
d8d0: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
d8e0: 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
d8f0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
d900: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d910: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
d920: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
d930: 67 67 65 72 3b 0a 20 20 20 20 69 6e 74 20 69 44  gger;.    int iD
d940: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
d950: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
d960: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
d970: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
d980: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
d990: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 0, iDb);..   
d9a0: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
d9b0: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
d9c0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
d9d0: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
d9e0: 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
d9f0: 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
da00: 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
da10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
da20: 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
da30: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
da40: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
da50: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
da60: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b   pTab->pTrigger;
da70: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
da80: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  gger ){.      as
da90: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
daa0: 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69  iDb==iDb || pTri
dab0: 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a  gger->iDb==1 );.
dac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
dad0: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
dae0: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29  se, pTrigger, 1)
daf0: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
db00: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
db10: 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
db20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
db30: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
db40: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
db50: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
db60: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
db70: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
db80: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
db90: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
dba0: 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
dbb0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
dbc0: 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
dbd0: 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
dbe0: 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
dbf0: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
dc00: 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
dc10: 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
dc20: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
dc30: 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
dc40: 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
dc50: 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
dc60: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75      if( pTab->au
dc70: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  toInc ){.      s
dc80: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
dc90: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
dca0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
dcb0: 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  s.sqlite_sequenc
dcc0: 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
dcd0: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
dce0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
dcf0: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
dd00: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
dd10: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
dd20: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
dd30: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
dd40: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
dd50: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
dd60: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
dd70: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
dd80: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
dd90: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
dda0: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
ddb0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
ddc0: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
ddd0: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
dde0: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
ddf0: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
de00: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
de10: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
de20: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
de30: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
de40: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
de50: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
de60: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
de70: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
de80: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
de90: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
dea0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
deb0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
dec0: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
ded0: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
dee0: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
def0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
df00: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
df10: 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
df20: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  e);.    if( !isV
df30: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73  iew ){.      des
df40: 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
df50: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a  , pTab);.    }..
df60: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
df70: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
df80: 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
df90: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
dfa0: 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68  modify.    ** th
dfb0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
dfc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
dfd0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
dfe0: 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
dff0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
e000: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
e010: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
e020: 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20   v, iDb);.  }.  
e030: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
e040: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
e050: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
e060: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
e070: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
e080: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e090: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
e0a0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
e0b0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
e0c0: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
e0d0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
e0e0: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
e0f0: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
e100: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
e110: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
e120: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
e130: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
e140: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
e150: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
e160: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
e170: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
e180: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
e190: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
e1a0: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
e1b0: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
e1c0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
e1d0: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
e1e0: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
e1f0: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
e200: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
e210: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
e220: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
e230: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
e240: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
e250: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
e260: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
e270: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
e280: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
e290: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
e2a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
e2b0: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
e2c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
e2d0: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
e2e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
e2f0: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
e300: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
e310: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
e320: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
e330: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
e340: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
e350: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
e360: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
e370: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
e380: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
e390: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
e3a0: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
e3b0: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
e3c0: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
e3d0: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
e3e0: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
e3f0: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
e400: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
e410: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
e420: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
e430: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
e440: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
e450: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
e460: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
e470: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
e480: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
e490: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
e4a0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
e4b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e4c0: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
e4d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e4e0: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
e4f0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
e500: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
e510: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
e520: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
e530: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
e540: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  hms. */.){.#ifnd
e550: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
e560: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
e570: 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
e580: 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
e590: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
e5a0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
e5b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
e5c0: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
e5d0: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
e5e0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
e5f0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
e600: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
e610: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
e620: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
e630: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
e640: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
e650: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
e660: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
e670: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
e680: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e690: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
e6a0: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
e6b0: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
e6c0: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
e6d0: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
e6e0: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
e6f0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
e700: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
e710: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
e720: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
e730: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
e740: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
e750: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
e760: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
e770: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e780: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
e790: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
e7a0: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
e7b0: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
e7c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
e7d0: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
e7e0: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
e7f0: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
e800: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
e810: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
e820: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
e830: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
e840: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
e850: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
e860: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
e870: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
e880: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
e890: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
e8a0: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
e8b0: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
e8c0: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
e8d0: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
e8e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
e8f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
e900: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
e910: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
e920: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
e930: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
e940: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
e950: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
e960: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
e970: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
e980: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
e990: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
e9a0: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
e9b0: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
e9c0: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
e9d0: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
e9e0: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
e9f0: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
ea00: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
ea10: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
ea20: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
ea30: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
ea40: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
ea50: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
ea60: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
ea70: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
ea80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ea90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
eaa0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
eab0: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
eac0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ead0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
eae0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
eaf0: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
eb00: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
eb10: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
eb20: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
eb30: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
eb40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eb50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
eb60: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
eb70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
eb80: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
eb90: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
eba0: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
ebb0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
ebc0: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
ebd0: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
ebe0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
ebf0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
ec00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ec10: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
ec20: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
ec30: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
ec40: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
ec50: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
ec60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
ec70: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
ec80: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
ec90: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
eca0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
ecb0: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
ecc0: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
ecd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
ece0: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
ecf0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
ed00: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
ed10: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
ed20: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
ed30: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
ed40: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
ed50: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
ed60: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
ed70: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
ed80: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
ed90: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
eda0: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
edb0: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
edc0: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
edd0: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
ede0: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e  Free(pFKey);.#en
edf0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ee00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
ee10: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
ee20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ee30: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
ee40: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ee50: 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
ee60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ee70: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ee80: 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
ee90: 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
eea0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
eeb0: 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
eec0: 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
eed0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
eee0: 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
eef0: 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
ef00: 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
ef10: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
ef20: 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
ef30: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
ef40: 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
ef50: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
ef60: 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
ef70: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
ef80: 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
ef90: 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
efa0: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
efb0: 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
efc0: 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
efd0: 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
efe0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
eff0: 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
f000: 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
f010: 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
f020: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f030: 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
f040: 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
f050: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
f060: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
f070: 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23   = isDeferred;.#
f080: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
f090: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
f0a0: 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
f0b0: 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
f0c0: 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
f0d0: 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
f0e0: 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
f0f0: 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
f100: 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
f110: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
f120: 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
f130: 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
f140: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
f150: 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
f160: 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
f170: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
f180: 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
f190: 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d   created.  The m
f1a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69  emory cell speci
f1b0: 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
f1c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
f1d0: 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
f1e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
f1f0: 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
f200: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
f210: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
f220: 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
f230: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
f240: 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
f250: 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
f260: 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
f270: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
f280: 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
f290: 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
f2a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f2b0: 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
f2c0: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
f2d0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
f2e0: 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
f2f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
f300: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
f310: 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
f320: 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
f330: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
f340: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20  pParse->nTab;   
f350: 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
f360: 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
f370: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
f380: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31  = pParse->nTab+1
f390: 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
f3a0: 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
f3b0: 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
f3c0: 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
f3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
f3e0: 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
f3f0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
f400: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
f410: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
f420: 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
f430: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f460: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
f470: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
f480: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f490: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
f4a0: 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
f4b0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f4c0: 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
f4d0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
f4e0: 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65   0,.      pParse
f4f0: 2d 3e 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  ->db->aDb[pIndex
f500: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  ->iDb].zName ) )
f510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
f520: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
f530: 6e 73 75 72 65 20 61 6c 6c 20 74 68 65 20 72 65  nsure all the re
f540: 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  quired collation
f550: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 61   sequences are a
f560: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20  vailable. This. 
f570: 20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c   ** routine will
f580: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c   invoke the coll
f590: 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c  ation-needed cal
f5a0: 6c 62 61 63 6b 20 69 66 20 6e 65 63 65 73 73 61  lback if necessa
f5b0: 72 79 20 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20  ry (and.  ** if 
f5c0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 72 65 67  one has been reg
f5d0: 69 73 74 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20  istered)..  */. 
f5e0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
f5f0: 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 70 50  kIndexCollSeq(pP
f600: 61 72 73 65 2c 20 70 49 6e 64 65 78 29 20 29 7b  arse, pIndex) ){
f610: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
f620: 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
f630: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f640: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
f650: 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
f660: 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
f670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f680: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
f690: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29   memRootPage, 0)
f6a0: 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a  ;.    tnum = 0;.
f6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
f6c0: 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
f6d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f6e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65  eAddOp(v, OP_Cle
f6f0: 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e 64 65 78  ar, tnum, pIndex
f700: 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ->iDb);.  }.  sq
f710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f720: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
f730: 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  ndex->iDb, 0);. 
f740: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
f750: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
f760: 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20   iIdx, tnum,.   
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
f790: 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
f7a0: 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
f7b0: 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64  OpenTableForRead
f7c0: 69 6e 67 28 76 2c 20 69 54 61 62 2c 20 70 54 61  ing(v, iTab, pTa
f7d0: 62 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  b);.  addr1 = sq
f7e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f7f0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
f800: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
f810: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
f820: 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  (v, pIndex, iTab
f830: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  );.  if( pIndex-
f840: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
f850: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72  e ){.    int cur
f860: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
f870: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f880: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 32 20  ;.    int addr2 
f890: 3d 20 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20  = curaddr+4;.   
f8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f8b0: 67 65 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d  geP2(v, curaddr-
f8c0: 31 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73  1, addr2);.    s
f8d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f8e0: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
f8f0: 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
f900: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f910: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b  P_AddImm, 1, 0);
f920: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f930: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e  AddOp(v, OP_IsUn
f940: 69 71 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72  ique, iIdx, addr
f950: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
f960: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c  dbeOp3(v, OP_Hal
f970: 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
f980: 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a  AINT, OE_Abort,.
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c      "indexed col
f9b0: 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
f9c0: 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
f9d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 64  ;.    assert( ad
f9e0: 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  dr2==sqlite3Vdbe
f9f0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 29  CurrentAddr(v) )
fa00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
fa10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
fa20: 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
fa30: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
fa40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
fa50: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
fa60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
fa70: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
fa80: 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  1, sqlite3VdbeCu
fa90: 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
faa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fab0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
fac0: 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
fad0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fae0: 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
faf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
fb00: 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
fb10: 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
fb20: 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
fb30: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
fb40: 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
fb50: 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
fb60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
fb70: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
fb80: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
fb90: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
fba0: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
fbb0: 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
fbc0: 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
fbd0: 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
fbe0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
fbf0: 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
fc00: 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
fc10: 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
fc20: 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
fc30: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
fc40: 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
fc50: 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
fc60: 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
fc70: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
fc80: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
fc90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
fca0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
fcb0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
fcc0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
fcd0: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
fce0: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
fcf0: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
fd00: 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
fd10: 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
fd20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
fd30: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
fd40: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
fd50: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
fd60: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
fd70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
fd80: 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
fd90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
fda0: 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
fdb0: 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
fdc0: 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
fdd0: 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
fde0: 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
fdf0: 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
fe00: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
fe10: 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
fe20: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
fe30: 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
fe40: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
fe50: 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
fe60: 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
fe70: 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
fe80: 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
fe90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
fea0: 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
feb0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
fec0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
fed0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
fee0: 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
fef0: 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
ff00: 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
ff10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
ff20: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
ff30: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
ff40: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
ff50: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
ff60: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
ff70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
ff80: 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
ff90: 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
ffa0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
ffb0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
ffc0: 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  ;   /* Table to 
ffd0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
ffe0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
fff0: 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  0; /* The index 
10000 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
10010 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
10020 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
10030 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
10040 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
10050 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
10060 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78   list */.  DbFix
10070 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20 46  er sFix;    /* F
10080 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
10090 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
100a0 54 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  Table */.  sqlit
100b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
100c0 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b  >db;..  int iDb;
100d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
100e0 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
100f0 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
10100 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
10110 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
10120 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
10130 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
10140 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
10150 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10160 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
10170 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
10180 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10190 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  dex;..  /*.  ** 
101a0 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
101b0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
101c0 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
101d0 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
101e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
101f0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
10200 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
10210 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
10220 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
10230 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
10240 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
10250 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
10260 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
10270 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
10280 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
10290 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
102a0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
102b0 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
102c0 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
102d0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
102e0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
102f0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
10300 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
10310 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10320 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66  eate_index;..#if
10330 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10340 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
10350 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
10360 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
10370 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
10380 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
10390 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
103a0 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
103b0 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20  database to 1.. 
103c0 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d     */.    pTab =
103d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
103e0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
103f0 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  blName);.    if(
10400 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
10410 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
10420 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20  && pTab->iDb==1 
10430 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31  ){.      iDb = 1
10440 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
10450 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
10460 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
10470 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
10480 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20  x", pName) &&.  
10490 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78        sqlite3Fix
104a0 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
104b0 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a  TblName).    ){.
104c0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
104d0 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
104e0 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
104f0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
10500 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
10510 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
10520 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
10530 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
10540 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
10550 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
10560 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
10570 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  rse, pTblName->a
10580 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
10590 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
105a0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
105b0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
105c0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
105d0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
105e0 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44  t( iDb==pTab->iD
105f0 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b );.  }else{.  
10600 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
10610 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
10620 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
10630 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70  ble;.    iDb = p
10640 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20  Tab->iDb;.  }.. 
10650 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
10660 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
10670 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10680 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
10690 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
106a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
106b0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
106c0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
106d0 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
106e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
106f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10700 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
10710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10720 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
10730 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
10740 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10750 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
10760 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
10770 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
10780 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
10790 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
107a0 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
107b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
107c0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
107d0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
107e0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
107f0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
10800 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
10810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
10820 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
10830 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
10840 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
10850 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
10860 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
10870 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
10880 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
10890 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
108a0 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
108b0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
108c0 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
108d0 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
108e0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
108f0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
10900 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
10910 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
10920 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
10930 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
10940 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
10950 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
10960 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
10970 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
10980 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
10990 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
109a0 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
109b0 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
109c0 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
109d0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
109e0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
109f0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ame);.    if( SQ
10a00 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
10a10 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
10a20 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
10a30 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10a40 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
10a50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10a60 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
10a70 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
10a80 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
10a90 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
10aa0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
10ab0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10ad0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
10ae0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
10af0 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  ISameName;    /*
10b00 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77   Another index w
10b10 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
10b20 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
10b30 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
10b40 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
10b50 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
10b60 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
10b70 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10b80 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
10b90 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
10ba0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10bb0 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ex;.      if( (p
10bc0 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  ISameName = sqli
10bd0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
10be0 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
10bf0 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20  iDb].zName))!=0 
10c00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10c10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10c20 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
10c30 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
10c40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
10c50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10c60 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
10c70 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e      if( (pTSameN
10c80 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ame = sqlite3Fin
10c90 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
10ca0 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
10cb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10cc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
10cd0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
10ce0 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
10cf0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
10d00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10d10 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
10d20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
10d30 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
10d40 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
10d50 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
10d60 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
10d70 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
10d80 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
10d90 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
10da0 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  {}.    sprintf(z
10db0 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20  Buf,"_%d",n);.  
10dc0 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
10dd0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
10de0 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  g(&zName, "sqlit
10df0 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70  e_autoindex_", p
10e00 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66  Tab->zName, zBuf
10e10 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
10e20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
10e30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10e40 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
10e50 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
10e60 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
10e70 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
10e80 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10e90 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
10ea0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
10eb0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
10ec0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
10ed0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
10ee0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
10ef0 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
10f00 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
10f10 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
10f20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
10f30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10f40 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
10f50 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
10f60 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
10f70 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
10f80 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
10f90 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
10fa0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10fb0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10fc0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
10fd0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
10fe0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
10ff0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11000 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
11010 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
11020 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
11030 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
11040 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
11050 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
11060 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
11070 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
11080 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
11090 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
110a0 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
110b0 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
110c0 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
110d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
110e0 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
110f0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
11100 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
11110 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
11120 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
11130 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
11140 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
11150 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64  nd(0, 0, &nullId
11160 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
11170 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11180 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11190 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
111a0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
111b0 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
111c0 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  /.  pIndex = sql
111d0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
111e0 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65  f(Index) + strle
111f0 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73  n(zName) + 1 + s
11200 69 7a 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20  izeof(int) +.   
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74       (sizeof(int
11230 29 2a 32 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c  )*2 + sizeof(Col
11240 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e  lSeq*))*pList->n
11250 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71  Expr );.  if( sq
11260 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
11270 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
11280 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11290 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
112a0 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78   = (int*)&pIndex
112b0 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
112c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20  pList->nExpr];. 
112d0 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73   pIndex->aiRowEs
112e0 74 20 3d 20 26 70 49 6e 64 65 78 2d 3e 61 69 43  t = &pIndex->aiC
112f0 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78  olumn[pList->nEx
11300 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  pr];.  pIndex->z
11310 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
11320 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
11330 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b  pList->nExpr+1];
11340 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
11350 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
11360 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
11370 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
11380 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
11390 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
113a0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
113b0 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
113c0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
113d0 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65  Name==0;.  pInde
113e0 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20  x->iDb = iDb;.. 
113f0 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
11400 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
11410 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
11420 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
11430 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
11440 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
11450 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
11460 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
11470 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
11480 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
11490 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
114a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
114b0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
114c0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
114d0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
114e0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
114f0 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
11500 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
11510 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
11520 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
11530 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
11540 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
11550 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11560 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
11570 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
11580 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
11590 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
115a0 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  e, pList->a[i].z
115b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
115c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
115d0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
115e0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
115f0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20  i] = j;.    if( 
11600 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11610 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
11620 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t( pList->a[i].p
11630 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
11640 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
11650 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
11660 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11670 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  r->pColl;.    }e
11680 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  lse{.      pInde
11690 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
116a0 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  [i] = pTab->aCol
116b0 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  [j].pColl;.    }
116c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
116d0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
116e0 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28  ll[i] );.    if(
116f0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
11700 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
11710 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
11720 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
11730 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
11740 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
11750 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11760 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11770 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  }.  pIndex->keyI
11780 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69  nfo.nField = pLi
11790 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c  st->nExpr;.  sql
117a0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
117b0 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  t(pIndex);..  if
117c0 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
117d0 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
117e0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
117f0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
11800 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
11810 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
11820 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
11830 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
11840 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
11850 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
11860 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
11870 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
11880 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
11890 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
118a0 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
118b0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
118c0 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
118d0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
118e0 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
118f0 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
11900 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
11910 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
11920 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
11930 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
11940 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
11950 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
11960 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
11970 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
11980 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
11990 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
119a0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
119b0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
119c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
119d0 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
119e0 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
119f0 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
11a00 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
11a10 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
11a20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
11a30 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
11a40 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
11a50 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
11a60 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
11a70 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
11a80 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
11a90 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ne );.      asse
11aa0 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e  rt( pIdx->autoIn
11ab0 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dex );.      ass
11ac0 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ert( pIndex->onE
11ad0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
11ae0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
11af0 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65  ->nColumn!=pInde
11b00 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  x->nColumn ) con
11b10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
11b20 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43  (k=0; k<pIdx->nC
11b30 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20  olumn; k++){.   
11b40 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
11b50 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
11b60 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
11b70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
11b80 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e   if( pIdx->keyIn
11b90 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e  fo.aColl[k]!=pIn
11ba0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
11bb0 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ll[k] ) break;. 
11bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11bd0 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
11be0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
11bf0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
11c00 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
11c10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
11c20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
11c30 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
11c40 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
11c50 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
11c60 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
11c70 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
11c80 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
11c90 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
11ca0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
11cb0 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
11cc0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
11cd0 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
11ce0 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
11cf0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
11d00 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
11d10 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
11d20 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
11d30 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
11d40 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
11d50 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
11d60 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
11d70 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
11d80 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
11d90 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
11da0 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
11db0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
11dc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
11dd0 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
11de0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
11df0 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
11e00 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
11e10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
11e20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11e30 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
11e40 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
11e50 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
11e60 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
11e70 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
11e80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
11e90 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
11ea0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
11eb0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
11ec0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
11ed0 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
11ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ef0 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
11f00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11f20 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
11f30 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
11f40 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
11f50 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
11f60 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
11f70 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
11f80 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
11f90 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
11fa0 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
11fb0 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
11fc0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
11fd0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
11fe0 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20  Db].idxHash, .  
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
12010 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e  Name, strlen(pIn
12020 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  dex->zName)+1, p
12030 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
12040 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
12050 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
12060 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
12070 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
12080 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12090 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
120a0 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
120b0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
120c0 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
120d0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
120e0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
120f0 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
12100 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
12110 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
12120 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
12130 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
12140 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
12150 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
12160 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
12170 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
12180 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
12190 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
121a0 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
121b0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
121c0 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
121d0 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
121e0 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
121f0 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
12200 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
12210 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
12220 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
12230 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
12240 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
12250 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
12260 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
12270 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
12280 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
12290 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
122a0 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
122b0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
122c0 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
122d0 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
122e0 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
122f0 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
12300 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
12310 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
12320 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
12330 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
12340 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
12350 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
12360 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
12370 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
12380 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
12390 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
123a0 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
123b0 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
123c0 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
123d0 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
123e0 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
123f0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
12400 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
12410 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
12420 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
12430 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
12440 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
12450 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20  arse->nMem++;.. 
12460 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
12470 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12480 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
12490 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
124a0 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  ndex;..    /* Cr
124b0 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
124c0 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
124d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
124e0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
124f0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
12500 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
12510 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12520 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
12530 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
12540 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12550 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
12560 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  m, 0);..    /* G
12570 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
12580 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
12590 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
125a0 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
125b0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
125c0 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
125d0 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
125e0 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nd ){.      /* A
125f0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
12600 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
12610 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
12620 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
12630 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
12640 69 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49  intf("CREATE%s I
12650 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
12660 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
12670 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
12680 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70  IQUE",.        p
12690 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  End->z - pName->
126a0 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70  z + 1,.        p
126b0 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
126c0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
126d0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
126e0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
126f0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
12700 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
12710 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
12720 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
12730 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
12740 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
12750 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
12760 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
12770 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
12780 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
12790 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
127a0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
127b0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
127c0 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
127d0 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c  index',%Q,%Q,#0,
127e0 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
127f0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
12800 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
12810 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
12820 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
12830 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
12840 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
12850 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
12860 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12870 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
12880 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74    sqliteFree(zSt
12890 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
128a0 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
128b0 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
128c0 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
128d0 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
128e0 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
128f0 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
12900 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
12910 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12920 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
12930 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
12940 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
12950 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
12960 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
12970 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
12980 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
12990 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
129a0 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
129b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
129c0 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d  ite3MPrintf("nam
129d0 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d  e='%q'", pIndex-
129e0 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
129f0 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MIC);.      sqli
12a00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12a10 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29  OP_Expire, 0, 0)
12a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12a30 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
12a40 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
12a50 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
12a60 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
12a70 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
12a80 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
12a90 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
12aa0 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
12ab0 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
12ac0 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
12ad0 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
12ae0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
12af0 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
12b00 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
12b10 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
12b20 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
12b30 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
12b40 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
12b50 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
12b60 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
12b70 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
12b80 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
12b90 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
12ba0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
12bb0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
12bc0 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
12bd0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
12be0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
12bf0 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
12c00 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
12c10 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
12c20 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
12c30 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
12c40 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
12c50 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
12c60 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
12c70 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
12c80 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
12c90 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
12ca0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
12cb0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
12cc0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
12cd0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
12ce0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
12cf0 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
12d00 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
12d10 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64  x ){.    freeInd
12d20 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
12d30 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
12d40 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
12d50 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
12d60 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29  Delete(pTblName)
12d70 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
12d80 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
12d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
12da0 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
12db0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
12dc0 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
12dd0 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
12de0 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
12df0 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
12e00 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
12e10 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
12e20 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
12e30 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
12e40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
12e50 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
12e60 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
12e70 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
12e80 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
12e90 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
12ea0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
12eb0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
12ec0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
12ed0 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
12ee0 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
12ef0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
12f00 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
12f10 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
12f20 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
12f30 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
12f40 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
12f50 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
12f60 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69  cular combiniati
12f70 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
12f80 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
12f90 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
12fa0 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
12fb0 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
12fc0 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
12fd0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
12fe0 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
12ff0 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
13000 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
13010 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
13020 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
13030 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
13040 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
13050 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
13060 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
13070 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
13080 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
13090 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
130a0 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
130b0 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
130c0 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
130d0 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
130e0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
130f0 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
13100 20 20 69 6e 74 20 2a 61 20 3d 20 70 49 64 78 2d    int *a = pIdx-
13110 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74  >aiRowEst;.  int
13120 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21   i;.  assert( a!
13130 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31  =0 );.  a[0] = 1
13140 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d  000000;.  for(i=
13150 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
13160 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61  >=1; i--){.    a
13170 5b 69 5d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  [i] = 10;.  }.  
13180 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
13190 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
131a0 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d    a[pIdx->nColum
131b0 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n] = 1;.  }.}../
131c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
131d0 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
131e0 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
131f0 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
13200 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
13210 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
13220 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
13230 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
13240 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
13250 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
13260 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
13270 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
13280 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13290 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
132a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
132b0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
132c0 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
132d0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
132e0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
132f0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
13300 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
13310 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
13320 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
13330 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
13340 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13350 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
13360 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
13370 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
13380 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
13390 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
133a0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
133b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
133c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
133d0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
133e0 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
133f0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
13400 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
13410 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
13420 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
13430 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
13440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13450 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
13460 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
13470 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
13480 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
13490 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
134a0 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
134b0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
134c0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
134d0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
134e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
134f0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
13500 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
13510 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
13520 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
13530 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
13540 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13550 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
13560 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
13570 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13580 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
13590 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
135a0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
135b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
135c0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
135d0 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
135e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
135f0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
13610 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 70 49  MIT_TEMPDB && pI
13620 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
13630 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
13640 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
13650 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
13660 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
13670 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
13680 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
13690 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
136a0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
136b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
136c0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
136d0 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
136e0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
136f0 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
13700 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
13710 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13720 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
13730 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70  .    int iDb = p
13740 49 6e 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20  Index->iDb;.    
13750 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
13760 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
13770 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
13780 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
13790 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  %Q",.       db->
137a0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
137b0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
137c0 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78  ),.       pIndex
137d0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
137e0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
137f0 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
13800 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
13810 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
13820 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
13830 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
13840 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
13850 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
13860 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
13870 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
13880 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
13890 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
138a0 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
138b0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
138c0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
138d0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
138e0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
138f0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
13900 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
13910 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
13920 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
13930 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
13940 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
13950 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
13960 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
13970 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
13980 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
13990 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
139a0 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
139b0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
139c0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
139d0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
139e0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
139f0 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d  if( pList->nId>=
13a00 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
13a10 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
13a20 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
13a30 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
13a40 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
13a50 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 5;.    a = sql
13a60 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
13a70 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ->a, pList->nAll
13a80 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  oc*sizeof(pList-
13a90 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
13aa0 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
13ab0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
13ac0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
13ad0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
13ae0 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
13af0 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   a;.  }.  memset
13b00 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
13b10 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nId], 0, sizeo
13b20 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
13b30 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  .  pList->a[pLis
13b40 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20  t->nId].zName = 
13b50 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
13b60 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20  oken(pToken);.  
13b70 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
13b80 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
13b90 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
13ba0 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
13bb0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
13bc0 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
13bd0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
13be0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
13bf0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
13c00 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
13c10 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
13c20 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
13c30 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
13c40 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
13c50 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
13c60 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
13c70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
13c80 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
13c90 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
13ca0 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
13cb0 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
13cc0 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
13cd0 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
13ce0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
13cf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
13d00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
13d10 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
13d20 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
13d30 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
13d40 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
13d50 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
13d60 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
13d70 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
13d80 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
13d90 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
13da0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
13db0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
13dc0 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
13dd0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
13de0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
13df0 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
13e00 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
13e10 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
13e20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
13e30 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
13e40 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
13e50 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
13e60 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
13e70 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
13e80 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
13e90 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13ea0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
13eb0 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
13ec0 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
13ed0 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
13ee0 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
13ef0 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
13f00 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
13f10 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
13f20 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
13f30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13f40 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
13f50 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
13f60 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
13f70 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
13f80 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
13f90 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
13fa0 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
13fb0 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
13fc0 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
13fd0 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
13fe0 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
13ff0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
14000 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
14010 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
14020 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
14030 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
14040 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
14050 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
14060 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
14070 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
14080 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
14090 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
140a0 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
140b0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
140c0 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
140d0 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
140e0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
140f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
14100 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
14110 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
14120 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
14130 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
14140 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
14150 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
14160 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
14170 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73  istAppend(SrcLis
14180 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
14190 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a  *pTable, Token *
141a0 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74  pDatabase){.  st
141b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
141c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
141d0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
141e0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
141f0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63  lloc( sizeof(Src
14200 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
14210 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
14220 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
14230 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d  >nAlloc = 1;.  }
14240 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53  .  if( pList->nS
14250 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rc>=pList->nAllo
14260 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
14270 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73   *pNew;.    pLis
14280 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
14290 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
142a0 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a  eRealloc(pList,.
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
142c0 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
142d0 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
142e0 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
142f0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
14300 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
14310 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
14320 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
14330 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
14340 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
14350 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74   pNew;.  }.  pIt
14360 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
14370 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d  List->nSrc];.  m
14380 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
14390 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
143a0 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
143b0 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
143c0 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
143d0 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
143e0 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
143f0 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
14400 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
14410 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
14420 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
14430 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
14440 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
14450 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
14460 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
14470 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70  ken(pTable);.  p
14480 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
14490 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
144a0 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65  mToken(pDatabase
144b0 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72  );.  pItem->iCur
144c0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73  sor = -1;.  pLis
144d0 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74  t->nSrc++;.  ret
144e0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
144f0 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f  .** Assign curso
14500 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
14510 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
14520 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
14530 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
14540 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
14550 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
14560 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
14570 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14580 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 69   *pItem;.  for(i
14590 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
145a0 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  >a; i<pList->nSr
145b0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
145c0 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  {.    if( pItem-
145d0 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
145e0 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  eak;.    pItem->
145f0 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
14600 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
14610 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
14620 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14630 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
14640 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
14650 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
14660 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rc);.    }.  }.}
14670 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
14680 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
14690 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
146a0 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
146b0 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
146c0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
146d0 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74  AddAlias(SrcList
146e0 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
146f0 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
14700 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e  List && pList->n
14710 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69  Src>0 ){.    pLi
14720 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
14730 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71  c-1].zAlias = sq
14740 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
14750 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  en(pToken);.  }.
14760 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
14770 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
14780 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
14790 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
147a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
147b0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
147c0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
147d0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
147e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
147f0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
14800 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
14810 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
14820 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
14830 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
14840 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
14850 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
14860 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
14870 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
14880 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
14890 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
148a0 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69  Alias);.    sqli
148b0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
148c0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
148d0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
148e0 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
148f0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
14900 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
14910 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
14920 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
14930 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ete(pItem->pUsin
14940 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
14950 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
14960 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
14970 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
14980 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
14990 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
149a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
149b0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
149c0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
149d0 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
149e0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
149f0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
14a00 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
14a10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
14a20 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
14a30 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14a40 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
14a50 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
14a60 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14a70 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
14a80 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
14a90 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
14aa0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14ab0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14ac0 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
14ad0 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
14ae0 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
14af0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
14b00 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
14b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b20 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
14b30 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
14b40 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
14b50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14b60 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14b70 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
14b80 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
14b90 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
14ba0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14bb0 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
14bc0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
14bd0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
14be0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
14bf0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
14c00 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
14c10 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
14c20 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
14c30 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
14c40 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
14c50 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
14c60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14c70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14c80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14c90 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
14ca0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20  OMMIT", 0, 0) ) 
14cb0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
14cc0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14cd0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
14ce0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14cf0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
14d00 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
14d10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
14d20 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
14d30 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14d40 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
14d50 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
14d60 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
14d70 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
14d80 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14d90 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14da0 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14db0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14dc0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14dd0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14de0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14df0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
14e00 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14e10 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14e20 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
14e30 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
14e40 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
14e50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14e60 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14e70 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
14e80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14e90 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
14ea0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
14eb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
14ec0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
14ed0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
14ee0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
14ef0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
14f00 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
14f10 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
14f20 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
14f30 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
14f40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
14f50 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
14f60 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
14f70 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
14f80 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14f90 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
14fa0 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
14fb0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
14fc0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
14fd0 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
14fe0 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f  y(db, 0, 0, MAX_
14ff0 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b  PAGES, &db->aDb[
15000 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
15010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15020 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15030 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15040 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
15050 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
15060 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
15070 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
15080 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15090 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
150a0 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
150b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
150c0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  }.    if( db->fl
150d0 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43  ags & !db->autoC
150e0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72  ommit ){.      r
150f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15100 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61  BeginTrans(db->a
15110 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20  Db[1].pBt, 1);. 
15120 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15140 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15150 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
15160 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65  e to get a write
15170 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20   lock on ".     
15180 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72       "the tempor
15190 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
151a0 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  e");.        pPa
151b0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
151c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
151d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
151e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
151f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15200 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
15210 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
15220 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64  chema cookie and
15230 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64   start.** a read
15240 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
15250 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62   all named datab
15260 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ase files..**.**
15270 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
15280 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61   that all schema
15290 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69   cookies be veri
152a0 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  fied and all.** 
152b0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
152c0 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  s be started bef
152d0 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ore anything els
152e0 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20  e happens in.** 
152f0 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
15300 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
15310 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  ine can be calle
15320 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68  d after much oth
15330 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62  er.** code has b
15340 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20  een generated.  
15350 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20  So here is what 
15360 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  we do:.**.** The
15370 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
15380 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15390 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f  ed, we code an O
153a0 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77  P_Goto that.** w
153b0 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75  ill jump to a su
153c0 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20  broutine at the 
153d0 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72  end of the progr
153e0 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20  am.  Then we.** 
153f0 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74  record every dat
15400 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73  abase that needs
15410 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69   its schema veri
15420 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fied in the.** p
15430 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
15440 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c  k field.  Later,
15450 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72   after all other
15460 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a   code has been.*
15470 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65  * generated, the
15480 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
15490 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65   does the cookie
154a0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61   verifications a
154b0 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65  nd.** starts the
154c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69   transactions wi
154d0 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20  ll be coded and 
154e0 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76  the OP_Goto P2 v
154f0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
15500 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
15510 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65   that subroutine
15520 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f  .  The generatio
15530 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  n of the.** cook
15540 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ie verification 
15550 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20  subroutine code 
15560 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74  happens in sqlit
15570 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
15580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
15590 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f   then code the O
155a0 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f  P_Goto only - do
155b0 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20  n't set flag to 
155c0 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63  verify the.** sc
155d0 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61  hema on any data
155e0 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e  bases.  This can
155f0 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69   be used to posi
15600 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f  tion the OP_Goto
15610 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65  .** early in the
15620 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65   code, before we
15630 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74   know if any dat
15640 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c  abase tables wil
15650 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  l be used..*/.vo
15660 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
15670 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
15680 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
15690 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
156a0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
156b0 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d  int mask;..  v =
156c0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
156d0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
156e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
156f0 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
15700 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73  ens if there was
15710 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a   a prior error *
15720 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
15730 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >db;.  if( pPars
15740 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30  e->cookieGoto==0
15750 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
15760 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
15770 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15780 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b   OP_Goto, 0, 0)+
15790 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  1;.  }.  if( iDb
157a0 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  >=0 ){.    asser
157b0 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
157c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
157d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
157e0 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
157f0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33     assert( iDb<3
15800 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  2 );.    mask = 
15810 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20  1<<iDb;.    if( 
15820 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d  (pParse->cookieM
15830 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
15840 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
15850 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
15860 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  sk;.      pParse
15870 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
15880 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  b] = db->aDb[iDb
15890 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ].schema_cookie;
158a0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
158b0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
158c0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
158d0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
158e0 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20  base(pParse);.  
158f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15900 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15910 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
15920 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
15930 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
15940 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
15950 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
15960 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
15970 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
15980 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
15990 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
159a0 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
159b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
159c0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
159d0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
159e0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
159f0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
15a00 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
15a10 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
15a20 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
15a30 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
15a40 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
15a50 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
15a60 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
15a70 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
15a80 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
15a90 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
15aa0 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
15ab0 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
15ac0 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
15ad0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
15ae0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
15af0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
15b00 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
15b10 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
15b20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
15b30 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
15b40 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
15b50 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
15b60 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
15b70 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
15b80 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
15b90 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
15ba0 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ot be set..**.**
15bb0 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69   Only database i
15bc0 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  Db and the temp 
15bd0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
15be0 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68  e writable by th
15bf0 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69  is call..** If i
15c00 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Db==0, then the 
15c10 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61  main and temp da
15c20 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65  tabases are made
15c30 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a   writable.   If.
15c40 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f  ** iDb==1 then o
15c50 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74  nly the temp dat
15c60 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72  abase is made wr
15c70 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e  itable.  If iDb>
15c80 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70  1 then the.** sp
15c90 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72  ecified auxiliar
15ca0 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  y database and t
15cb0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
15cc0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
15cd0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
15ce0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
15cf0 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
15d00 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
15d10 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
15d20 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
15d30 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15d40 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
15d50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
15d60 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
15d70 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
15d80 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69  );.  pParse->wri
15d90 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62  teMask |= 1<<iDb
15da0 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65  ;.  if( setState
15db0 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e  ment && pParse->
15dc0 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
15dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15de0 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e  p(v, OP_Statemen
15df0 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a  t, iDb, 0);.  }.
15e00 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50    if( (OMIT_TEMP
15e10 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26  DB || iDb!=1) &&
15e20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
15e30 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20  [1].pBt!=0 ){.  
15e40 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
15e50 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
15e60 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e  rse, setStatemen
15e70 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 1);.  }.}../*
15e80 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
15e90 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
15ea0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
15eb0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
15ec0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
15ed0 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
15ee0 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
15ef0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
15f00 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
15f10 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
15f20 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43 6f 6c 6c  lationMatch(Coll
15f30 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49 6e 64 65  Seq *pColl, Inde
15f40 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
15f50 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65  t n = pIndex->ke
15f60 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b 0a 20 20  yInfo.nField;.  
15f70 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20 3d 20 70  CollSeq **pp = p
15f80 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
15f90 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Coll;.  while( n
15fa0 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 70  -- ){.    if( *p
15fb0 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65 74 75 72  p==pColl ) retur
15fc0 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b 3b 0a 20  n 1;.    pp++;. 
15fd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
15fe0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
15ff0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
16000 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
16010 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
16020 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
16030 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
16040 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
16050 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
16060 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
16070 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
16080 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
16090 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
160a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
160b0 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 6c 53  ble *pTab, CollS
160c0 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e  eq *pColl){.  In
160d0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
160e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
160f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16100 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
16110 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
16120 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
16130 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
16140 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
16150 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   pColl==0 || col
16160 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70 43 6f 6c  lationMatch(pCol
16170 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  l,pIndex) ){.   
16180 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
16190 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
161a0 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69  arse, 0, pTab->i
161b0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
161c0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
161d0 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
161e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
161f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
16200 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
16210 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
16220 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
16230 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
16240 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
16250 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
16260 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
16270 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
16280 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
16290 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
162a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
162b0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
162c0 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
162d0 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
162e0 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53  e *pParse, CollS
162f0 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44 62  eq *pColl){.  Db
16300 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
16310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
16320 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
16330 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
16360 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
16370 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
16380 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
16390 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
163a0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
163b0 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
163c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
163d0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
163e0 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
163f0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16410 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
16420 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f  atabase */..  fo
16430 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
16440 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
16450 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
16460 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d 30  {.    if( pDb==0
16470 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16480 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
16490 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c  hFirst(&pDb->tbl
164a0 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
164b0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
164c0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
164d0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
164e0 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
164f0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
16500 73 65 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c 29  se, pTab, pColl)
16510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
16520 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
16530 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
16540 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
16550 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
16560 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
16590 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
165a0 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
165b0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
165c0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
165d0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
165e0 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
165f0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
16600 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
16610 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
16620 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
16630 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
16640 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
16650 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
16660 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
16670 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
16680 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
16690 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
166a0 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
166b0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
166c0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
166d0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
166e0 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
166f0 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
16700 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
16710 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
16720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16730 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
16740 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
16750 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
16760 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
16770 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
16780 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
16790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
167a0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
167b0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
167c0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
167d0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
167e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
167f0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
16800 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
16810 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
16820 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
16830 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
16840 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
16870 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
16880 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
16890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
168a0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
168b0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
168c0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
168f0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
16900 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
16910 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
16920 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16930 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
16940 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
16950 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16960 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
16970 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
16980 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
16990 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
169a0 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
169b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
169c0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
169d0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
169e0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
169f0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
16a00 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
16a10 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
16a20 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
16a30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
16a40 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
16a50 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
16a60 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
16a70 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
16a80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
16a90 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
16aa0 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
16ab0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  z==0 ){.    pCol
16ac0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
16ad0 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65  ollSeq(db, db->e
16ae0 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  nc, pName1->z, p
16af0 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Name1->n, 0);.  
16b00 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
16b10 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
16b20 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 70 43  bases(pParse, pC
16b30 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
16b40 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
16b50 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
16b60 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
16b70 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
16b80 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
16b90 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
16ba0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
16bb0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f  NameFromToken(pO
16bc0 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d  bjName);.  zDb =
16bd0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16be0 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
16bf0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
16c00 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
16c10 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
16c20 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
16c30 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
16c40 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
16c50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16c60 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
16c70 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
16c80 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
16c90 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20  eFree(z);.  if( 
16ca0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
16cb0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
16cc0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
16cd0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
16ce0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16cf0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16d00 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
16d10 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
16d20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16d30 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
16d40 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
16d50 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
16d60 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.