/ Hex Artifact Content
Login

Artifact 1f40c07a11e0a4eed1cef1ad4e52cf3f9770f220:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 33 30 20 32 30 30 35 2f 30 36 2f 33 30  1.330 2005/06/30
02f0: 20 31 37 3a 30 34 3a 32 31 20 64 72 68 20 45 78   17:04:21 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
05e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0600: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0610: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0620: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0630: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0650: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0660: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0670: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0680: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0690: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
06a0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
06b0: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
06c0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
06d0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
06e0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
06f0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0700: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0710: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
0720: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
0730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0740: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
0750: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
0760: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
0770: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0780: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0790: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
07a0: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
07b0: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
07c0: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
07d0: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
07e0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
07f0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
0800: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0810: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
0820: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
0830: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
0840: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
0850: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
0860: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
0870: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0880: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0890: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
08a0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
08b0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
08c0: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
08d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
08e0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
08f0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0900: 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  to-1, sqlite3Vdb
0910: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
0920: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
0930: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
0940: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
0950: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
0960: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
0970: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
0980: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
0990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
09a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
09b0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
09c0: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
09d0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
09e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
09f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0a00: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
0a10: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
0a20: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
0a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
0a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0a50: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
0a60: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
0a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0a80: 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74  Add a No-op that
0a90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
0aa0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
0ab0: 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a  he compiled SQL.
0ac0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
0ad0: 20 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d   as its P3 argum
0ae0: 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20  ent.  This does 
0af0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66  not change the f
0b00: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
0b10: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
0b20: 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  am. .    **.    
0b30: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
0b40: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  to implement sql
0b50: 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20  ite3_trace()..  
0b60: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
0b70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  VdbeOp3(v, OP_No
0b80: 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65  op, 0, 0, pParse
0b90: 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e  ->zSql, pParse->
0ba0: 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53  zTail-pParse->zS
0bb0: 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ql);.  }...  /* 
0bc0: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
0bd0: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
0be0: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
0bf0: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0c00: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
0c10: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
0c20: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0c30: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
0c40: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
0c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
0c60: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
0c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
0c80: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
0c90: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
0ca0: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
0cd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70   pParse->nMaxDep
0ce0: 74 68 2b 31 2c 20 70 50 61 72 73 65 2d 3e 65 78  th+1, pParse->ex
0cf0: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
0d00: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d10: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
0d20: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
0d30: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
0d40: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
0d60: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61  ERROR;.  }.  pPa
0d80: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  rse->nTab = 0;. 
0d90: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
0da0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  0;.  pParse->nSe
0db0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  t = 0;.  pParse-
0dc0: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61  >nVar = 0;.  pPa
0dd0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
0de0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
0df0: 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d  ookieGoto = 0;.}
0e00: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
0e10: 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20  parser and code 
0e20: 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73  generator recurs
0e30: 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ively in order t
0e40: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  o generate.** co
0e50: 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73  de for the SQL s
0e60: 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f  tatement given o
0e70: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
0e80: 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78  he pParse contex
0e90: 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  t.** currently u
0ea0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
0eb0: 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72  n.  When the par
0ec0: 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72  ser is run recur
0ed0: 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77  sively.** this w
0ee0: 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50  ay, the final OP
0ef0: 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70  _Halt is not app
0f00: 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20  ended and other 
0f10: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a  initialization.*
0f20: 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69  * and finalizati
0f30: 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69  on steps are omi
0f40: 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f  tted because tho
0f50: 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20  se are handling 
0f60: 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d  by the.** outerm
0f70: 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a  ost parser..**.*
0f80: 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67  * Not everything
0f90: 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54   is nestable.  T
0fa0: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0fb0: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d  designed to perm
0fc0: 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  it.** INSERT, UP
0fd0: 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
0fe0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69   operations agai
0ff0: 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  nst SQLITE_MASTE
1000: 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20  R.  Use.** care 
1010: 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f  if you decide to
1020: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73   try to use this
1030: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d   routine for som
1040: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73  e other purposes
1050: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1060: 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72  3NestedParse(Par
1070: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1080: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1090: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
10a0: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
10b0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 20 64  l;.  int rc;.# d
10c0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
10d0: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
10e0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
10f0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1100: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1110: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1120: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1130: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1140: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1150: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1160: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1170: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1180: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1190: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
11a0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
11b0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
11c0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
11d0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
11e0: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
11f0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1200: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1210: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1220: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1230: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1240: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1250: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1260: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1270: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
1280: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1290: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
12a0: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
12b0: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
12c0: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
12d0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
12e0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
12f0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1300: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1310: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1320: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1330: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1340: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1350: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1360: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1370: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1380: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1390: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
13a0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
13b0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
13c0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
13d0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
13e0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
13f0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
1400: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
1410: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1420: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1430: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1440: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1450: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1460: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1470: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1480: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1490: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
14a0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
14b0: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
14c0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
14d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
14e0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14f0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
1500: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
1510: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1520: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1530: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1540: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1550: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1560: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1570: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1580: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1590: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
15a0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
15b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
15c0: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
15d0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
15e0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
15f0: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
1600: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
1610: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
1620: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
1630: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1640: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
1650: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
1660: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
1670: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
1680: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61  db->aDb[j].tblHa
1690: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
16a0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
16b0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
16c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
16d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
16e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
16f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1700: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1710: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1720: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1730: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1740: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1750: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1760: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1770: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1780: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1790: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
17a0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
17b0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
17c0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
17d0: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
17e0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
17f0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1800: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
1810: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
1820: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
1830: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
1840: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1850: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
1860: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
1870: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
1880: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
1890: 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73  LocateTable(Pars
18a0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
18b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
18c0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
18d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
18e0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
18f0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1900: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1910: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1920: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1930: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1940: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1950: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1960: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1970: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1980: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1990: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
19a0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
19b0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
19c0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
19d0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
19e0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
19f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a00: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a10: 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20   table: %s.%s", 
1a20: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
1a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1a40: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
1a50: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
1a60: 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1a70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a80: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1a90: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e  \"%s\" is not in
1aa0: 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1ab0: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
1ac0: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20  e, zDbase);.    
1ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1ae0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1af0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1b00: 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ble: %s", zName)
1b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1b20: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1b30: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
1b40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
1b50: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1b60: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1b70: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
1b80: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
1b90: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
1ba0: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
1bb0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
1bc0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1bd0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1be0: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
1bf0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1c00: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1c10: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1c20: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1c30: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1c40: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
1c50: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
1c60: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
1c70: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1c80: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
1c90: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
1ca0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1cb0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
1cc0: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
1cd0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
1ce0: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
1cf0: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
1d00: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
1d10: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
1d20: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
1d30: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
1d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1d50: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1d60: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
1d70: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1d80: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1d90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
1da0: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
1db0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1dc0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
1dd0: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
1de0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
1df0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1e00: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
1e10: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1e20: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
1e30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1e40: 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  b, db->aDb[j].zN
1e50: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1e60: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1e70: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1e80: 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e  b[j].idxHash, zN
1e90: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1ea0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1ec0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1ed0: 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  ** Reclaim the m
1ee0: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e  emory used by an
1ef0: 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63   index.*/.static
1f00: 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28   void freeIndex(
1f10: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c  Index *p){.  sql
1f20: 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41  iteFree(p->zColA
1f30: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ff);.  sqliteFre
1f40: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  e(p);.}../*.** R
1f50: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
1f60: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
1f70: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
1f80: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
1f90: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
1fa0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
1fb0: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
1fc0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1fd0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74   hash tables but
1fe0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e  .** it is not un
1ff0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
2000: 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e  Table that it in
2010: 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b  dexes..** Unlink
2020: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ing from the Tab
2030: 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  le must be done 
2040: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
2050: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2060: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65  ic void sqliteDe
2070: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
2080: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  3 *db, Index *p)
2090: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
20a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
20b0: 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30  0 && p->zName!=0
20c0: 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c   );.  pOld = sql
20d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
20e0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
20f0: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
2100: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2120: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
2130: 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21   0);.  if( pOld!
2140: 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b  =0 && pOld!=p ){
2150: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2160: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2170: 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  p->iDb].idxHash,
2180: 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pOld->zName,.  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e     strlen(pOld->
21b0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
21c0: 0a 20 20 7d 0a 20 20 66 72 65 65 49 6e 64 65 78  .  }.  freeIndex
21d0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  (p);.}../*.** Fo
21e0: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
21f0: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
2200: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
2210: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
2220: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
2230: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
2240: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
2250: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
2260: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
2270: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
2280: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
2290: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
22a0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
22b0: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
22c0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
22d0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
22e0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
22f0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
2300: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
2310: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  ndex;.  int len;
2320: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
2330: 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49  (zIdxName);.  pI
2340: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61  ndex = sqlite3Ha
2350: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2360: 62 5b 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  b[iDb].idxHash, 
2370: 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c  zIdxName, len+1,
2380: 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   0);.  if( pInde
2390: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  x ){.    if( pIn
23a0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
23b0: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
23c0: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61       pIndex->pTa
23d0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  ble->pIndex = pI
23e0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
23f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
2400: 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  dex *p;.      fo
2410: 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  r(p=pIndex->pTab
2420: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  le->pIndex; p &&
2430: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
2440: 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  x; p=p->pNext){}
2450: 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20  .      if( p && 
2460: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
2470: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
2480: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
2490: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
24a0: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
24b0: 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
24c0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
24d0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
24e0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  es;.}../*.** Era
24f0: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
2500: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2510: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
2520: 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61  h tables of.** a
2530: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2540: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2550: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
2560: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
2570: 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  efore the databa
2580: 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69  se closes.  It i
2590: 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75  s also called du
25a0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ring a rollback.
25b0: 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ** if there were
25c0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
25d0: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
25e0: 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a  action or if a.*
25f0: 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  * schema-cookie 
2600: 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e  mismatch occurs.
2610: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30  .**.** If iDb<=0
2620: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
2630: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
2640: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
2650: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
2660: 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65  .  If iDb>=2 the
2670: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
2680: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
2690: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
26a0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
26b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26c0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
26d0: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
26e0: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48  b, int iDb){.  H
26f0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
2700: 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20    Hash temp1;.  
2710: 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e  Hash temp2;.  in
2720: 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72  t i, j;..  asser
2730: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
2740: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62  <db->nDb );.  db
2750: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2760: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a  TE_Initialized;.
2770: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
27a0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d  >aDb[i];.    tem
27b0: 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73  p1 = pDb->tblHas
27c0: 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70  h;.    temp2 = p
27d0: 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20  Db->trigHash;.  
27e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
27f0: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
2800: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2810: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
2820: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2830: 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20  pDb->aFKey);.   
2840: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2850: 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  r(&pDb->idxHash)
2860: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
2870: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2880: 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20  &temp2); pElem; 
2890: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
28a0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
28b0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
28c0: 65 54 72 69 67 67 65 72 28 28 54 72 69 67 67 65  eTrigger((Trigge
28d0: 72 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  r*)sqliteHashDat
28e0: 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d  a(pElem));.    }
28f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2900: 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20  Clear(&temp2);. 
2910: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
2920: 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  it(&pDb->tblHash
2930: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2940: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f  RING, 0);.    fo
2950: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
2960: 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b  shFirst(&temp1);
2970: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
2980: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
2990: 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  em)){.      Tabl
29a0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
29b0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
29c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
29d0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
29e0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
29f0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
2a00: 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 70 44 62  &temp1);.    pDb
2a10: 2d 3e 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20  ->pSeqTab = 0;. 
2a20: 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72     DbClearProper
2a30: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68  ty(db, i, DB_Sch
2a40: 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20  emaLoaded);.    
2a50: 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75  if( iDb>0 ) retu
2a60: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
2a70: 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62  ( iDb==0 );.  db
2a80: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2a90: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2aa0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
2ab0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
2ac0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2ad0: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
2ae0: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
2af0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72  n remove then fr
2b00: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
2b10: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
2b20: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
2b30: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
2b40: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
2b50: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
2b60: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
2b70: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
2b80: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2b90: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
2ba0: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
2bb0: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
2bc0: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
2bd0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
2be0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
2bf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2c00: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2c10: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2c20: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2c30: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
2c40: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
2c50: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
2c60: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
2c70: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
2c80: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
2c90: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
2ca0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2cb0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2cc0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2cd0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2ce0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
2cf0: 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e  liteFree(pDb->zN
2d00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
2d10: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
2d20: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d30: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
2d40: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
2d50: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
2d60: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
2d70: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
2d80: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
2d90: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
2da0: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
2db0: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
2dc0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
2dd0: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
2de0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
2df0: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
2e00: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
2e10: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
2e20: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ));.    sqliteFr
2e30: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
2e40: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
2e50: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
2e60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2e70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2e80: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
2e90: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
2ea0: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
2eb0: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
2ec0: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2ed0: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
2ee0: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
2ef0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
2f00: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
2f10: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
2f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2f30: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2f40: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
2f50: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
2f60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2f70: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
2f80: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
2f90: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
2fa0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
2fb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2fc0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
2fd0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
2fe0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2ff0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3000: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3010: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3020: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3030: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3040: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
3050: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20  mn names from a 
3060: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a  table or view..*
3070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3080: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3090: 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62  ames(Table *pTab
30a0: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
30b0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
30c0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
30d0: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
30e0: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
30f0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
3100: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
3110: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
3120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
3130: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
3140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3150: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
3160: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3170: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
3180: 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ype);.    }.    
3190: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
31a0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e->aCol);.  }.  
31b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
31c0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
31d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
31e0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
31f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
3200: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3210: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
3220: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
3230: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
3240: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
3250: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
3260: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
3270: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
3280: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
3290: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
32a0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
32b0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
32c0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72  hash table.  Nor
32d0: 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a   does it remove.
32e0: 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ** foreign keys 
32f0: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e  from the sqlite.
3300: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3310: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
3320: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
3330: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
3340: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
3350: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3360: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
3370: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
3380: 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   Indices associa
3390: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
33a0: 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20  le are unlinked 
33b0: 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a  from the "db".**
33c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
33d0: 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66  if db!=NULL.  If
33e0: 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63   db==NULL, indic
33f0: 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a  es attached to.*
3400: 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  * the table are 
3410: 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20  deleted, but it 
3420: 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20  is assumed they 
3430: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3440: 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  n.** unlinked..*
3450: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3460: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
3470: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
3480: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
3490: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
34a0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
34b0: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
34c0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
34d0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  turn;..  /* Do n
34e0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
34f0: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3500: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3510: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3520: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3530: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3540: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3550: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3560: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3570: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3580: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3590: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
35a0: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
35b0: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
35c0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
35d0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
35e0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
35f0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3600: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3610: 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  ex->iDb==pTable-
3620: 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d  >iDb || (pTable-
3630: 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65  >iDb==0 && pInde
3640: 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20  x->iDb==1) );.  
3650: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
3660: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3670: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3680: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3690: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
36a0: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
36b0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
36c0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
36d0: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
36e0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
36f0: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3700: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b  from the db->aFK
3710: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
3720: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
3730: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
3740: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
3750: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
3760: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
3770: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
3780: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44  sert( pTable->iD
3790: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
37a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37b0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
37c0: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61  b[pTable->iDb].a
37d0: 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  FKey,.          
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72   pFKey->zTo, str
3800: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
3810: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
3820: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
3830: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3840: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3850: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3860: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3870: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3880: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3890: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
38a0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
38b0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
38c0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
38d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
38e0: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3900: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3910: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3920: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
3930: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
3940: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
3950: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
3960: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
3970: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3980: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3990: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
39a0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
39b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
39c0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
39d0: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
39e0: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
39f0: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
3a00: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
3a10: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
3a20: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3a30: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
3a40: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
3a50: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
3a60: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
3a70: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
3a80: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3a90: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
3aa0: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3ab0: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29  (zTabName)+1, 0)
3ac0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
3ad0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3ae0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3af0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
3b00: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
3b10: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
3b20: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
3b30: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
3b40: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
3b50: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
3b60: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  pDb->aFKey, pF1-
3b70: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3b80: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
3b90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3ba0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3bb0: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3bc0: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3bd0: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
3be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
3bf0: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3c00: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3c10: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3c20: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3c30: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
3c40: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
3c50: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
3c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3c70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3c80: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3c90: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20  le(db, p);.  }. 
3ca0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
3cb0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3cc0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
3cd0: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
3ce0: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
3cf0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
3d00: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
3d10: 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20   token with any 
3d20: 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76  quotations remov
3d30: 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ed.  Space to ho
3d40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
3d50: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
3d60: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3d70: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
3d80: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
3d90: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
3da0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nction..**.** To
3db0: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
3dc0: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
3dd0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
3de0: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
3df0: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
3e00: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
3e10: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
3e20: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
3e30: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
3e40: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
3e50: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
3e60: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
3e70: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f  NameFromToken(To
3e80: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
3e90: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
3ea0: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
3eb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3ec0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
3ed0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
3ee0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3ef0: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3f00: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
3f10: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
3f30: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
3f40: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
3f50: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
3f60: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
3f70: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
3f80: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
3f90: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
3fa0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
3fb0: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
3fc0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
3fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3fe0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
3ff0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
4000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4010: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
4020: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
4030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4040: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
4050: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
4060: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
4070: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
4080: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
4090: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
40a0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
40b0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
40c0: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
40d0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
40e0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
40f0: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4100: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4110: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4120: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4130: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4140: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4150: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
4160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4170: 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  findDb(sqlite3 *
4180: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
4190: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
41a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
41b0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
41c0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
41d0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
41e0: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
41f0: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4200: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4210: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4220: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4230: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
4240: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
4250: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
4260: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
4270: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
4280: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
4290: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
42a0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e     n = strlen(zN
42b0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
42c0: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
42d0: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
42e0: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
42f0: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4300: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4310: 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28   ) && n==strlen(
4320: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
4330: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
4340: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
4350: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
4360: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4380: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4390: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
43a0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
43b0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
43c0: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
43d0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
43e0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
43f0: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4400: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4410: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4420: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4430: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4440: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4450: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
4460: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
4470: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4480: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4490: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
44a0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
44b0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
44c0: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
44d0: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
44e0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
44f0: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4500: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4510: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4520: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4540: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
4550: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
4560: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
4570: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
4580: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
4590: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
45a0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
45b0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
45c0: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
45d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
45e0: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
45f0: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4600: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4610: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4620: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4630: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4640: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
4650: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
4660: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4670: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
4680: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
4690: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
46a0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
46b0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
46c0: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
46d0: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
46e0: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
46f0: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
4700: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4720: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
4730: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
4740: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4750: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
4760: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
4770: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
4780: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
4790: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
47a0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
47b0: 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62      iDb = findDb
47c0: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
47d0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
47e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
47f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
4800: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
4810: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
4820: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4830: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
4840: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
4850: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
4860: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
4870: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
4880: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
4890: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
48a0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
48b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
48c0: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
48d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
48e0: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
48f0: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
4900: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
4910: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
4920: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
4930: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
4940: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
4950: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
4960: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
4970: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
4980: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
4990: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
49a0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
49b0: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
49c0: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
49d0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
49e0: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
49f0: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4a00: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
4a10: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
4a20: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
4a30: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
4a40: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
4a50: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
4a60: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
4a70: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
4a80: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
4a90: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
4aa0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
4ab0: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
4ac0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
4ad0: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
4ae0: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
4af0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4b00: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
4b10: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
4b20: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
4b30: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
4b40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4b50: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
4b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
4b80: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
4b90: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
4ba0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
4bb0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
4bc0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
4bd0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
4be0: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
4bf0: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
4c00: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
4c10: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4c20: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
4c30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4c40: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
4c50: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
4c60: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
4c70: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
4c80: 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53  name.  The.** pS
4c90: 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  tart token is th
4ca0: 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61  e CREATE and pNa
4cb0: 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  me is the table 
4cc0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d  name.  The isTem
4cd0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
4ce0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
4cf0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
4d00: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
4d10: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
4d20: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
4d30: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4d40: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
4d50: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
4d60: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
4d70: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
4d80: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
4d90: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
4da0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
4db0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
4dc0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
4dd0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
4de0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
4df0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
4e00: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
4e10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4e20: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
4e30: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
4e40: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
4e50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
4e60: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
4e70: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
4e80: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
4e90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
4ea0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4eb0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
4ec0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
4ed0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
4ee0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
4ef0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
4f00: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
4f10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4f20: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
4f30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4f40: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4f50: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4f60: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
4f70: 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a  "CREATE" token *
4f80: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4f90: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
4fa0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
4fb0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
4fc0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
4fd0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
4fe0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
4ff0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5000: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
5010: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
5020: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5030: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
5040: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20  */.  int isView 
5050: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5060: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
5070: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
5080: 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a  Table;.  Index *
5090: 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pIdx;.  char *zN
50a0: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
50b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
50c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
50d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
50e0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
50f0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
5100: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5110: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
5120: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
5130: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
5140: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
5150: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
5160: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
5170: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
5180: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
5190: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
51a0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
51b0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
51c0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
51d0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
51e0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
51f0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5200: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
5210: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5220: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
5230: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
5240: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5250: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
5260: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
5270: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
5280: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5290: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
52a0: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
52b0: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
52c0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
52d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
52e0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
52f0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5300: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
5310: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
5320: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
5330: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
5340: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
5350: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
5360: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
5370: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
5380: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
5390: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
53a0: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
53b0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
53c0: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
53d0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
53e0: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
53f0: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
5400: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
5410: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
5420: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
5430: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
5440: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
5450: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5460: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
5470: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
5480: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
5490: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
54a0: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
54b0: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
54c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
54d0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
54e0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
54f0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
5500: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
5510: 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f    }.  if( !OMIT_
5520: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
5530: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
5540: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
5550: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
5560: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5570: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
5580: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
5590: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
55a0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
55b0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
55c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
55d0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
55e0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
55f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
5600: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
5610: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
5620: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5630: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
5640: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
5650: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
5660: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
5670: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
5680: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5690: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
56a0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
56b0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
56c0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
56d0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
56e0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
56f0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
5700: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
5710: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
5720: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5730: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
5740: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5750: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
5760: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
5770: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
5780: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
5790: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
57a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
57b0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
57c0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
57d0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
57e0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
57f0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
5800: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
5810: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
5820: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
5830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
5840: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5850: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
5860: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
5870: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5880: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5890: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
58a0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
58b0: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
58c0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
58d0: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
58e0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
58f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
5900: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5910: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
5920: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
5930: 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a  * it does..  */.
5940: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5950: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
5960: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
5970: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5980: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
5990: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
59a0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
59b0: 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
59c0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ].zName);.  if( 
59d0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
59e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
59f0: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
5a00: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
5a10: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74   pName);.    got
5a20: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5a30: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ror;.  }.  if( (
5a40: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
5a50: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
5a60: 65 2c 20 30 29 29 21 3d 30 20 26 26 20 0a 20 20  e, 0))!=0 && .  
5a70: 20 20 20 20 28 20 69 44 62 3d 3d 30 20 7c 7c 20      ( iDb==0 || 
5a80: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
5a90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5aa0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5ab0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
5ac0: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
5ad0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
5ae0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5af0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
5b00: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61  Table = sqliteMa
5b10: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
5b20: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
5b30: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ble==0 ){.    pP
5b40: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
5b50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
5b60: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5b70: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5b80: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
5b90: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
5ba0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
5bb0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
5bc0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
5bd0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
5be0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
5bf0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
5c00: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
5c10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
5c20: 31 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  1;.  if( pParse-
5c30: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
5c40: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
5c50: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
5c60: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
5c70: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
5c80: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
5c90: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
5ca0: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
5cb0: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
5cc0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
5cd0: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
5ce0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
5cf0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
5d00: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
5d10: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
5d20: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
5d30: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
5d40: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
5d50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5d60: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
5d70: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
5d80: 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d  d && strcmp(zNam
5d90: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
5da0: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
5db0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65  db->aDb[iDb].pSe
5dc0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
5dd0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5de0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
5df0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
5e00: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
5e10: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
5e20: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
5e30: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
5e40: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
5e50: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
5e60: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
5e70: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
5e80: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
5e90: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
5ea0: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
5eb0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
5ec0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
5ed0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
5ee0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
5ef0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
5f00: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
5f10: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
5f20: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
5f30: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
5f40: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
5f50: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
5f60: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5f70: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
5f80: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
5f90: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
5fa0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
5fb0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
5fc0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
5fd0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c  0 ){.    int lbl
5fe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
5ff0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
6000: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
6010: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
6020: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
6030: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
6040: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
6050: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
6060: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
6070: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  w..    */.    sq
6080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6090: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
60a0: 20 69 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66   iDb, 1);   /* f
60b0: 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile_format */.  
60c0: 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56    lbl = sqlite3V
60d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
60e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
6100: 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c  0, lbl);.    sql
6110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6120: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6130: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
6140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6150: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
6160: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
6170: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6180: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6190: 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29  ger, db->enc, 0)
61a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
61b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
61c0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b  Cookie, iDb, 4);
61d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
61e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
61f0: 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  lbl);..    /* Th
6200: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
6210: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
6220: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
6230: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
6240: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
6250: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
6260: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
6270: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
6280: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
6290: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
62a0: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
62b0: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
62c0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
62d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
62e0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
62f0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
6300: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
6310: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6320: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c  ** The rowid val
6330: 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  ue is needed by 
6340: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  the code that sq
6350: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
6360: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
6370: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  te..    */.#ifnd
6380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6390: 49 45 57 0a 20 20 20 20 69 66 28 20 69 73 56 69  IEW.    if( isVi
63a0: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
63b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
63c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
63d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
63e0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6410: 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  le, iDb, 0);.   
6420: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
6430: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
6440: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
6450: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6460: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 30  P_NewRowid, 0, 0
6470: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6480: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
6490: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
64a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
64b0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
64c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
64d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
64e0: 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ert, 0, 0);.    
64f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6500: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6510: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6520: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6530: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Pull, 1, 0);.  }
6540: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
6550: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
6560: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
6570: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
6580: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
6590: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
65a0: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
65b0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
65c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
65d0: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
65e0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
65f0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
6600: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
6610: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
6620: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
6630: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
6640: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
6650: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
6660: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
6670: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
6680: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
6690: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
66a0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
66b0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
66c0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
66d0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
66e0: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
66f0: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
6700: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
6710: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
6720: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
6730: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
6740: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
6750: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
6760: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
6770: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
6780: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6790: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
67a0: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
67b0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
67c0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
67d0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
67e0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
67f0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
6800: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
6810: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
6820: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
6830: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6840: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
6850: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
6860: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
6870: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
6880: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
6890: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
68a0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
68b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
68c0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
68d0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
68e0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
68f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6900: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
6910: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6920: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6930: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6940: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
6950: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6960: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
6970: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6980: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
6990: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
69a0: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
69b0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
69c0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
69d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
69e0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
69f0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
6a00: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
6a10: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
6a20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6a30: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
6a40: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
6a50: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
6a60: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
6a70: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
6a80: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
6a90: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
6aa0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
6ab0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
6ac0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
6ad0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6ae0: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
6af0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
6b00: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
6b10: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
6b20: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
6b30: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6b40: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
6b50: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
6b60: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
6b70: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
6b80: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
6b90: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
6ba0: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
6bb0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
6bc0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
6bd0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
6be0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
6bf0: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
6c00: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
6c10: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
6c20: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6c30: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
6c40: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
6c50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
6c60: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
6c70: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
6c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6c90: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
6ca0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
6cb0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
6cc0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
6cd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6ce0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
6cf0: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
6d00: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
6d10: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
6d20: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6d30: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6d40: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6d50: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6d60: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6d70: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
6d80: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
6d90: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
6da0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6db0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
6dc0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6dd0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6de0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6df0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
6e00: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
6e10: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
6e20: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
6e30: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
6e40: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
6e50: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
6e60: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
6e70: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
6e80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6e90: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
6ea0: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
6eb0: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
6ec0: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
6ed0: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
6ee0: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
6ef0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
6f00: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
6f10: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
6f20: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
6f30: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
6f40: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
6f50: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
6f60: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
6f70: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
6f80: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
6f90: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
6fa0: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
6fb0: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
6fc0: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
6fd0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
6fe0: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
6ff0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
7000: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
7010: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
7040: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7050: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
7060: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7070: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
7080: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7090: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
70a0: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
70b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
70c0: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
70d0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
70e0: 4f 4e 45 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  ONE.**.** If non
70f0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7100: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
7110: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
7120: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
7130: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
7140: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
7150: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
7160: 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54  (const Token *pT
7170: 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  ype){.  u32 h = 
7180: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
7190: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
71a0: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  IC;.  const unsi
71b0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d  gned char *zIn =
71c0: 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e   pType->z;.  con
71d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
71e0: 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70 65 2d   *zEnd = &pType-
71f0: 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20  >z[pType->n];.. 
7200: 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e   while( zIn!=zEn
7210: 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  d ){.    h = (h<
7220: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
7230: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b  erToLower[*zIn];
7240: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
7250: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7260: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
7270: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
7280: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
7290: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
72a0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
72b0: 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20   .    }else if( 
72c0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
72d0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
72e0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
72f0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
7300: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7310: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7320: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
7330: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
7340: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
7350: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
7360: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7370: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
7380: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7390: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
73a0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
73c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
73d0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
73e0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
73f0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7400: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65  _NONE;.    }else
7410: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7420: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7430: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7440: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7450: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7460: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 20 0a 20  _AFF_INTEGER; . 
7470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
7490: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
74a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
74b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
74c0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
74d0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
74e0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
74f0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7500: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
7510: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
7520: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
7530: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
7540: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
7550: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
7560: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
7570: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
7580: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
7590: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
75a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
75b0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
75c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
75d0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
75e0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
75f0: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
7600: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
7610: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
7620: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
7630: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
7640: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
7650: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
7660: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
7670: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7680: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
7690: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
76a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
76b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
76c0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
76d0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
76e0: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
76f0: 43 6f 6c 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74  Col[i];.  assert
7700: 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30  ( pCol->zType==0
7710: 20 29 3b 0a 23 69 66 20 30 0a 20 20 7a 20 3d 20   );.#if 0.  z = 
7720: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
7730: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 6e 2b  liteMallocRaw(n+
7740: 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  1);.  if( z==0 )
7750: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
7760: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
7770: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 49 6e  .    int c = zIn
7780: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73  [i];.    if( iss
7790: 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e  pace(c) ) contin
77a0: 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d  ue;.    z[j++] =
77b0: 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d   c;.  }.  z[j] =
77c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 43 6f   0;.#endif.  pCo
77d0: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
77e0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
77f0: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
7800: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
7810: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
7820: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
7830: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7840: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
7850: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
7860: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7870: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
7880: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
7890: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
78a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
78b0: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
78c0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
78d0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
78e0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
78f0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
7900: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
7910: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7920: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
7930: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
7940: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
7950: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
7960: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
7970: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7980: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
7990: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
79a0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
79b0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
79c0: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
79d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
79e0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
79f0: 0a 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61  .  pCol = &(p->a
7a00: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
7a10: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
7a20: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
7a30: 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29  unction(pExpr) )
7a40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7a50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
7a60: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
7a70: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
7a80: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
7a90: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
7aa0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
7ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7ac0: 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  te(pCol->pDflt);
7ad0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  .    pCol->pDflt
7ae0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7af0: 70 28 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  p(pExpr);.  }.  
7b00: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7b10: 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pExpr);.}../*.
7b20: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
7b30: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
7b40: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
7b50: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
7b60: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
7b70: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
7b80: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
7b90: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
7ba0: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
7bb0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
7bc0: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
7bd0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
7be0: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
7bf0: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
7c00: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
7c10: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
7c20: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
7c30: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
7c40: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
7c50: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
7c60: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
7c70: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
7c80: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
7c90: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
7ca0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
7cb0: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
7cc0: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
7cd0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
7ce0: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
7cf0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
7d00: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
7d10: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
7d20: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
7d30: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
7d40: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
7d50: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
7d60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
7d70: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
7d80: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
7d90: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
7da0: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
7db0: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
7dc0: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
7dd0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
7de0: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
7df0: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
7e00: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
7e10: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
7e20: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
7e30: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
7e40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7e50: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
7e60: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7e70: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
7e80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7e90: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
7ea0: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
7eb0: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
7ec0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
7ed0: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
7ee0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
7ef0: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
7f00: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
7f10: 49 6e 63 20 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc       /* Tru
7f20: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
7f30: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
7f40: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
7f50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
7f60: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7f70: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
7f80: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
7f90: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
7fa0: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
7fb0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
7fc0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
7fd0: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
7fe0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7ff0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
8000: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
8010: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
8020: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
8030: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
8040: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
8050: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
8060: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
8070: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
8080: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
8090: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
80a0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
80b0: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
80c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
80d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
80e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
80f0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
8100: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
8110: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
8120: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8130: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
8140: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
8150: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
8160: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8170: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
8180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8190: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
81a0: 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol ) pTab->aCol[
81b0: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
81c0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
81d0: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  f( pList->nExpr>
81e0: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
81f0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
8200: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
8210: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
8220: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8230: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
8240: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
8250: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
8260: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
8270: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  0 ){.    pTab->i
8280: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
8290: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
82a0: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54   onError;.    pT
82b0: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75  ab->autoInc = au
82c0: 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69  toInc;.  }else i
82d0: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
82e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
82f0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
8300: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8310: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
8320: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
8330: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
8340: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
8350: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
8360: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
8370: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
8380: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
8390: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
83a0: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b   onError, 0, 0);
83b0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
83c0: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
83d0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
83e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
83f0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
8400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
8410: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
8420: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
8430: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
8440: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
8450: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
8460: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
8470: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
8480: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
8490: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
84a0: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
84b0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
84c0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
84d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
84e0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
84f0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
8500: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
8510: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
8520: 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  ol-1;..  pColl =
8530: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
8540: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54  llSeq(pParse, zT
8550: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70  ype, nType);.  p
8560: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20  ->aCol[i].pColl 
8570: 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49  = pColl;..  /* I
8580: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
8590: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
85a0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
85b0: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
85c0: 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e  .  ** then an in
85d0: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
85e0: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
85f0: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
8600: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  the.  ** collati
8610: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
8620: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
8630: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
8640: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  e..  */.  for(pI
8650: 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20  dx = p->pIndex; 
8660: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
8670: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73  >pNext){.    ass
8680: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
8690: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  mn==1 );.    if(
86a0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
86b0: 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65  0]==i ) pIdx->ke
86c0: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
86d0: 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pColl;.  }.}../
86e0: 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
86f0: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20  3CheckCollSeq() 
8700: 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e  for all collatin
8710: 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61  g sequences in a
8720: 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f  n index,.** in o
8730: 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 74  rder to verify t
8740: 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65  hat all the nece
8750: 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20  ssary collating 
8760: 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a  sequences are.**
8770: 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20   loaded..*/.int 
8780: 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65  sqlite3CheckInde
8790: 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  xCollSeq(Parse *
87a0: 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
87b0: 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78  Idx){.  if( pIdx
87c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
87d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
87e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
87f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
8800: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
8810: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b  (pParse, pIdx->k
8820: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
8830: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8840: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
8870: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8880: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
8890: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
88a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
88b0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
88c0: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
88d0: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
88e0: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
88f0: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
8900: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
8910: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
8920: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
8930: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
8940: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
8950: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
8960: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
8970: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
8980: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
8990: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
89a0: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
89b0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
89c0: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
89d0: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
89e0: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
89f0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
8a00: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
8a10: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
8a20: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
8a30: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
8a40: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
8a50: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
8a60: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
8a70: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
8a80: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
8a90: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
8aa0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8ab0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
8ac0: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
8ad0: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  to.** pParse..*/
8ae0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
8af0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
8b00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
8b10: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8b20: 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73   int nName){.  s
8b30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8b40: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
8b50: 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 75  c = db->enc;.  u
8b60: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
8b70: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 0a 20 20 43  >init.busy;..  C
8b80: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
8b90: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
8ba0: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
8bb0: 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75  e, nName, initbu
8bc0: 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  sy);.  if( !init
8bd0: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
8be0: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
8bf0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
8c00: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
8c10: 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61  q(db, pColl, zNa
8c20: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
8c30: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
8c40: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20      if( nName<0 
8c50: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65  ){.        nName
8c60: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
8c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8c90: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
8ca0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8cb0: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d  nce: %.*s", nNam
8cc0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
8cd0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   pColl = 0;.    
8ce0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8cf0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
8d00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8d10: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
8d20: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
8d30: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
8d40: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
8d50: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
8d60: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
8d70: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
8d80: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
8d90: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
8da0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
8db0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
8dc0: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
8dd0: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
8de0: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
8df0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
8e00: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
8e10: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
8e20: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
8e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
8e40: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
8e50: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
8e60: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
8e70: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
8e80: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
8e90: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
8ea0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
8eb0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
8ec0: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
8ed0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
8ee0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
8ef0: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
8f00: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
8f10: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
8f20: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
8f30: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
8f40: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
8f50: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
8f60: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
8f70: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
8f80: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
8f90: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
8fa0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
8fb0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
8fc0: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
8fd0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
8fe0: 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  okie(sqlite3 *db
8ff0: 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  , Vdbe *v, int i
9000: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db){.  sqlite3Vd
9010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9020: 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69  teger, db->aDb[i
9030: 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
9040: 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  e+1, 0);.  sqlit
9050: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9060: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
9070: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  , 0);.}../*.** M
9080: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
9090: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
90a0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
90b0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
90c0: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
90d0: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
90e0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
90f0: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
9100: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
9110: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
9120: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
9130: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
9140: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
9150: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
9160: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
9170: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
9180: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
9190: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
91a0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
91b0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
91c0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
91d0: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
91e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
91f0: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
9200: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
9210: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
9220: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
9230: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
9240: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
9250: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
9260: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
9270: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
9280: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67  pIdx, char *zSig
9290: 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73  nedIdent){.  uns
92a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65  igned char *zIde
92b0: 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  nt = (unsigned c
92c0: 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e  har*)zSignedIden
92d0: 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  t;.  int i, j, n
92e0: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
92f0: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
9300: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
9310: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
9320: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
9330: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
9340: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
9350: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
9360: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
9370: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
93a0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
93b0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
93c0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
93d0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  ++] = '"';.  for
93e0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
93f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
9400: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
9410: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
9420: 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  =='"' ) z[i++] =
9430: 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '"';.  }.  if( 
9440: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
9450: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d  +] = '"';.  z[i]
9460: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
9470: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
9480: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
9490: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
94a0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
94b0: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
94c0: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
94d0: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
94e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
94f0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
9500: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
9510: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
9520: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
9530: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
9540: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
9550: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
9560: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
9570: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
9580: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
9590: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20   *zSep2, *zEnd, 
95a0: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
95b0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
95c0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
95d0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
95e0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
95f0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
9600: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
9610: 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c  e);.    z = pCol
9620: 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28  ->zType;.    if(
9630: 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d   z ){.      n +=
9640: 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29   (strlen(z) + 1)
9650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20  ;.    }.  }.  n 
9660: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
9670: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
9680: 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70  n<50 ){.    zSep
9690: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
96a0: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
96b0: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
96c0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
96d0: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
96e0: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
96f0: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
9700: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
9710: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
9720: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
9730: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
9740: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
9750: 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c  .  strcpy(zStmt,
9760: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 70   !OMIT_TEMPDB&&p
9770: 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45 41  ->iDb==1 ? "CREA
9780: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 3a  TE TEMP TABLE ":
9790: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
97a0: 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  k = strlen(z
97b0: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
97c0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
97d0: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
97e0: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
97f0: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
9800: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
9810: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
9820: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
9830: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
9840: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
9850: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
9860: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
9870: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
9880: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
9890: 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c     if( (z = pCol
98a0: 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20  ->zType)!=0 ){. 
98b0: 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20       zStmt[k++] 
98c0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72  = ' ';.      str
98d0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
98e0: 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74  );.      k += st
98f0: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  rlen(z);.    }. 
9900: 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74   }.  strcpy(&zSt
9910: 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20  mt[k], zEnd);.  
9920: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
9930: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9940: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
9950: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
9960: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
9970: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
9980: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9990: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
99a0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
99b0: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
99c0: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
99d0: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
99e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
99f0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
9a00: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
9a10: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
9a20: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
9a30: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
9a40: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
9a50: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
9a60: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
9a70: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
9a80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
9a90: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
9aa0: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
9ab0: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
9ac0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
9ad0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
9ae0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
9af0: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
9b00: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
9b10: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
9b20: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
9b30: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
9b40: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
9b50: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
9b60: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
9b70: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
9b80: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
9b90: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
9ba0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
9bb0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
9bc0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
9bd0: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
9be0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
9bf0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
9c00: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
9c10: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
9c20: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
9c30: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
9c40: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
9c50: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
9c60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
9c70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
9c80: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
9c90: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
9ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
9cb0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
9cc0: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
9cd0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
9ce0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
9cf0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
9d00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
9d10: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
9d20: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
9d30: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
9d40: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
9d50: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
9d60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e        /* The fin
9d70: 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20  al ')' token in 
9d80: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
9d90: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
9da0: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
9db0: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
9dc0: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
9dd0: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
9de0: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
9df0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9e00: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  db;..  if( (pEnd
9e10: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
9e20: 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  0) || pParse->nE
9e30: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
9e40: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
9e50: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
9e60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9e70: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
9e80: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  rn;..  assert( !
9e90: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
9ea0: 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20   !pSelect );..  
9eb0: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
9ec0: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
9ed0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
9ee0: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
9ef0: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
9f00: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
9f10: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
9f20: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
9f30: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
9f40: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
9f50: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
9f60: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
9f70: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
9f80: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
9f90: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
9fa0: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
9fb0: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
9fc0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
9fd0: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
9fe0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
9ff0: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
a000: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
a010: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70  it.busy ){.    p
a020: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
a030: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
a040: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
a050: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
a060: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
a070: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
a080: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
a090: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
a0a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
a0b0: 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  .  The record nu
a0c0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
a0d0: 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72  e new table entr
a0e0: 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  y should already
a0f0: 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b   be on the stack
a100: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
a110: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
a120: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
a130: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
a140: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
a150: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
a160: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
a170: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
a180: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
a190: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
a1a0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
a1b0: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
a1c0: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
a1d0: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
a1e0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
a1f0: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
a200: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
a210: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
a220: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
a230: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
a240: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
a250: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
a260: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
a270: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
a280: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
a290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a2a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
a2b0: 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  e, 0, 0);..    /
a2c0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
a2d0: 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65  tpage for the ne
a2e0: 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68  w table and push
a2f0: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61   it onto the sta
a300: 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65  ck..    ** A vie
a310: 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67  w has no rootpag
a320: 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20  e, so just push 
a330: 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20  a zero onto the 
a340: 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a  stack for.    **
a350: 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c   views.  Initial
a360: 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65  ize zType at the
a370: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
a380: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
a390: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
a3a0: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
a3b0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  able */.      /*
a3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a3d0: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  p(v, OP_CreateTa
a3e0: 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b  ble, p->iDb, 0);
a3f0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
a400: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
a410: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
a420: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
a430: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
a440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
a450: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 2f 2a  A view */.    /*
a460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a470: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
a480: 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  , 0, 0); */.    
a490: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
a4a0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
a4b0: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
a4c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
a4d0: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
a4e0: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
a4f0: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
a500: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
a510: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
a520: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
a530: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
a540: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
a550: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
a560: 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65   table is on the
a570: 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65   top of the vdbe
a580: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20   stack..    **. 
a590: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
a5a0: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
a5b0: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
a5c0: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
a5d0: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
a5e0: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
a5f0: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
a600: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
a610: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
a620: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
a630: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
a640: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
a650: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
a660: 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  lTab;.      sqli
a670: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a680: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
a690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a6a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
a6b0: 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b  ger, p->iDb, 0);
a6c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a6d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a6e0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a  enWrite, 1, 0);.
a6f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
a700: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
a710: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
a720: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54  se, pSelect, SRT
a730: 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c  _Table, 1, 0, 0,
a740: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a750: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a760: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30  , OP_Close, 1, 0
a770: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
a780: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
a790: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20          pSelTab 
a7a0: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
a7b0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
a7c0: 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e, 0, pSelect);.
a7d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
a7e0: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
a7f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a800: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
a810: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
a820: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
a830: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
a840: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
a850: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
a860: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
a870: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
a880: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
a890: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
a8a0: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
a8b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a8c0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
a8d0: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
a8e0: 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
a8f0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
a900: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
a910: 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
a920: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
a930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a940: 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50  n = pEnd->z - pP
a950: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
a960: 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53  .z + 1;.      zS
a970: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
a980: 69 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20  intf("CREATE %s 
a990: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
a9a0: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
a9b0: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a  oken.z);.    }..
a9c0: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
a9d0: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
a9e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
a9f0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
aa00: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
aa10: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
aa20: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
aa30: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
aa40: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
aa50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
aa60: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20  've collected.  
aa70: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
aa80: 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20  e preallocated. 
aa90: 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68     ** slot is th
aaa0: 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68  e 2nd item on th
aab0: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f  e stack.  The to
aac0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
aad0: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  s the.    ** roo
aae0: 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  t page for the n
aaf0: 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30  ew table (or a 0
ab00: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69   if this is a vi
ab10: 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ew)..    */.    
ab20: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
ab30: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
ab40: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
ab50: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
ab60: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
ab70: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
ab80: 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c  rootpage=#0, sql
ab90: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
aba0: 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20  ERE rowid=#1",. 
abb0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e       db->aDb[p->
abc0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
abd0: 4d 41 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62 29  MA_TABLE(p->iDb)
abe0: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
abf0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
ac00: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
ac10: 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
ac20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
ac30: 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (zStmt);.    sql
ac40: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
ac50: 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b  (db, v, p->iDb);
ac60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ac70: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
ac80: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
ac90: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
aca0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
acb0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
acc0: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
acd0: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
ace0: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
acf0: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
ad00: 20 69 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20   if( p->autoInc 
ad10: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      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 20 20 69 66 28 20 70  Db];.      if( p
ad40: 44 62 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  Db->pSeqTab==0 )
ad50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ad60: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
ad70: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
ad80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
ad90: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
ada0: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
adb0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
adc0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
add0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
ade0: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
adf0: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
ae00: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
ae10: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
ae20: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
ae30: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
ae40: 61 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69  arseSchema, p->i
ae50: 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73  Db, 0,.        s
ae60: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74  qlite3MPrintf("t
ae70: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d  bl_name='%q'",p-
ae80: 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
ae90: 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  MIC);.  }...  /*
aea0: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
aeb0: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
aec0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
aed0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
aee0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
aef0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
af00: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
af10: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
af20: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
af30: 20 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20   .    Db *pDb = 
af40: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
af50: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
af60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
af70: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  pDb->tblHash, p-
af80: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
af90: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
afa0: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
afb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
afc0: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
afd0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
afe0: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
aff0: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
b000: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
b010: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b020: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
b030: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
b040: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
b050: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
b060: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
b070: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
b080: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
b090: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
b0a0: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61  xtTo = sqlite3Ha
b0b0: 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b  shFind(&pDb->aFK
b0c0: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
b0d0: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nTo);.      sqli
b0e0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
b0f0: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
b100: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65  ->zTo, nTo, pFKe
b110: 79 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  y);.    }.#endif
b120: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
b130: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
b140: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
b150: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
b160: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
b170: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
b180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
b190: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
b1a0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
b1b0: 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65    assert( !pSele
b1c0: 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70  ct && pCons && p
b1d0: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  End );.      if(
b1e0: 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70   pCons->z==0 ) p
b1f0: 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20  Cons = pEnd;.   
b200: 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
b210: 65 74 20 3d 20 31 33 20 2b 20 28 70 43 6f 6e 73  et = 13 + (pCons
b220: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
b230: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
b240: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
b250: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b260: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
b270: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
b280: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
b290: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
b2a0: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
b2b0: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
b2c0: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
b2d0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
b2e0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
b2f0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
b300: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
b310: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
b320: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
b330: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
b340: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
b350: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
b360: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
b370: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
b380: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
b390: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
b3a0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
b3b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
b3c0: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
b3d0: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
b3e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b3f0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
b400: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
b410: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20  /.  int isTemp  
b420: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
b430: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
b440: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  iew */.){.  Tabl
b450: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
b460: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
b470: 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e  char *z;.  Token
b480: 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72   sEnd;.  DbFixer
b490: 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a   sFix;.  Token *
b4a0: 70 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 70 50  pName;..  if( pP
b4b0: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
b4c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b4d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
b4e0: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
b4f0: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
b500: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
b510: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
b520: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
b530: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
b540: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
b550: 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31  , pBegin, pName1
b560: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
b570: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
b580: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
b590: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
b5a0: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
b5b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b5c0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b5d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b5e0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
b5f0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
b600: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
b610: 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
b620: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
b630: 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c   pParse, p->iDb,
b640: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
b650: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
b660: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
b670: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
b680: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b690: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b6a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
b6b0: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
b6c0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
b6d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
b6e0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
b6f0: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
b700: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
b710: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
b720: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
b730: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
b740: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
b750: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
b760: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
b770: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
b780: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
b790: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
b7a0: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
b7b0: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
b7c0: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
b7d0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
b7e0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65  te3SelectDup(pSe
b7f0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
b800: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b810: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50  lect);.  if( !pP
b820: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
b830: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
b840: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
b850: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
b860: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
b870: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
b880: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
b890: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
b8a0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
b8b0: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
b8c0: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
b8d0: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
b8e0: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
b8f0: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
b900: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
b910: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
b920: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
b930: 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  = sEnd.z - pBegi
b940: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  n->z;.  z = (con
b950: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
b960: 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  *)pBegin->z;.  w
b970: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b  hile( n>0 && (z[
b980: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73  n-1]==';' || iss
b990: 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b  pace(z[n-1])) ){
b9a0: 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
b9b0: 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
b9c0: 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
b9d0: 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
b9e0: 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
b9f0: 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
ba00: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
ba10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
ba20: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
ba30: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
ba40: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
ba50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
ba60: 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EW */..#ifndef S
ba70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ba80: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
ba90: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
baa0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
bab0: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
bac0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
bad0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
bae0: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
baf0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
bb00: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
bb10: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
bb20: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
bb30: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
bb40: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
bb50: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
bb60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
bb70: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
bb80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
bb90: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
bba0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
bbb0: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
bbc0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
bbd0: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
bbe0: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
bbf0: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
bc00: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
bc10: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
bc20: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
bc30: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
bc40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
bc50: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
bc60: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
bc70: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
bc80: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
bc90: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
bca0: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20  s assigned */.. 
bcb0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
bcc0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
bcd0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
bce0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
bcf0: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
bd00: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
bd10: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
bd20: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
bd30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
bd40: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
bd50: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
bd60: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
bd70: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
bd80: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
bd90: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
bda0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
bdb0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
bdc0: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
bdd0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
bde0: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
bdf0: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
be00: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
be10: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
be20: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
be30: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
be40: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
be50: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
be60: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
be70: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
be80: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
be90: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
bea0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
beb0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
bec0: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
bed0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
bee0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
bef0: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
bf00: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
bf10: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
bf20: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
bf30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bf40: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
bf50: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
bf60: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
bf70: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
bf80: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
bf90: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
bfa0: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
bfb0: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
bfc0: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
bfd0: 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
bfe0: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
bff0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
c000: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
c010: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
c020: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
c030: 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
c040: 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
c050: 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
c060: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
c070: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
c080: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
c090: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
c0a0: 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
c0b0: 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
c0c0: 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
c0d0: 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
c0e0: 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
c0f0: 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
c100: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
c110: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
c120: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
c130: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
c140: 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
c150: 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d  electDup(pTable-
c160: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 20 3d  >pSelect);.  n =
c170: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
c180: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
c190: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
c1a0: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
c1b0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
c1c0: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
c1d0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c1e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c1f0: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
c200: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
c210: 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20  ;.  if( pSelTab 
c220: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c230: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
c240: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
c250: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
c260: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  ol;.    pTable->
c270: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
c280: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
c290: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
c2a0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
c2b0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
c2c0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
c2d0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65  elTab);.    DbSe
c2e0: 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65  tProperty(pParse
c2f0: 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44  ->db, pTable->iD
c300: 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  b, DB_UnresetVie
c310: 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ws);.  }else{.  
c320: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
c330: 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a   0;.    nErr++;.
c340: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
c350: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b  ectDelete(pSel);
c360: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
c370: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   .}.#endif /* SQ
c380: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
c390: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
c3a0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
c3b0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
c3c0: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
c3d0: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
c3e0: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
c3f0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
c400: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
c410: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
c420: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
c430: 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
c440: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
c450: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
c460: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
c470: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
c480: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
c490: 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  .tblHash); i; i=
c4a0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
c4b0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
c4c0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
c4d0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
c4e0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
c4f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65  {.      sqliteRe
c500: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
c510: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
c520: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
c530: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
c540: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
c550: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
c560: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
c570: 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
c580: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c590: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
c5a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c5b0: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
c5c0: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
c5d0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
c5e0: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
c5f0: 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
c600: 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
c610: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
c620: 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
c630: 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
c640: 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
c650: 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
c660: 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
c670: 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  To..*/.#ifndef S
c680: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
c690: 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
c6a0: 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
c6b0: 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72  Db *pDb, int iFr
c6c0: 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
c6d0: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
c6e0: 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  .  .  for(pElem=
c6f0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
c700: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  &pDb->tblHash); 
c710: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
c720: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
c730: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
c740: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
c750: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
c760: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
c770: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
c780: 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
c790: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  o;.      return;
c7a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
c7b0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
c7c0: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69 64 78  hFirst(&pDb->idx
c7d0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
c7e0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
c7f0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
c800: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
c810: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
c820: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
c830: 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
c840: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
c850: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
c860: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
c870: 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a 7d  }.  assert(0);.}
c880: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
c890: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
c8a0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
c8b0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
c8c0: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
c8d0: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
c8e0: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
c8f0: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
c900: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
c910: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
c920: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
c930: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
c940: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
c950: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
c960: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
c970: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
c980: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
c990: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
c9a0: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
c9b0: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
c9c0: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
c9d0: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
c9e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
c9f0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ca00: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ca10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca20: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
ca30: 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a  , iTable, iDb);.
ca40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ca50: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ca60: 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70   /* OP_Destroy p
ca70: 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72  ushes an integer
ca80: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
ca90: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
caa0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
cab0: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
cac0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
cad0: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
cae0: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
caf0: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
cb00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
cb10: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
cb20: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
cb30: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
cb40: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
cb50: 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68 65   The "#0" in the
cb60: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
cb70: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
cb80: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
cb90: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20  alue.  ** is on 
cba0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
cbb0: 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74  tack.  See sqlit
cbc0: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
cbd0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
cbe0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
cbf0: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
cc00: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
cc10: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 30  page=%d WHERE #0
cc20: 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30   AND rootpage=#0
cc30: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
cc40: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
cc50: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
cc60: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a  (iDb), iTable);.
cc70: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
cc80: 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
cc90: 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
cca0: 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
ccb0: 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
ccc0: 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
ccd0: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
cce0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ccf0: 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
cd00: 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
cd10: 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
cd20: 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
cd30: 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
cd40: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
cd50: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
cd60: 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
cd70: 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
cd80: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
cd90: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
cda0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cdb0: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
cdc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
cdd0: 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
cde0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
cdf0: 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
ce00: 20 2a 70 49 64 78 3b 0a 20 20 64 65 73 74 72 6f   *pIdx;.  destro
ce10: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
ce20: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54  , pTab->tnum, pT
ce30: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28  ab->iDb);.  for(
ce40: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
ce50: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
ce60: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
ce70: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ce80: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
ce90: 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a  um, pIdx->iDb);.
cea0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
ceb0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
cec0: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
ced0: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
cee0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cef0: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
cf00: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
cf10: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
cf20: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
cf30: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
cf40: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
cf50: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
cf60: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
cf70: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
cf80: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
cf90: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
cfa0: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
cfb0: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
cfc0: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
cfd0: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
cfe0: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
cff0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
d000: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
d010: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
d020: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
d030: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
d040: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
d050: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
d060: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
d070: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
d080: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
d090: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
d0a0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
d0b0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d0c0: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
d0d0: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
d0e0: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
d0f0: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
d100: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
d110: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
d120: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
d130: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
d140: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
d150: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
d160: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
d170: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
d180: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
d190: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
d1a0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
d1b0: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
d1c0: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
d1d0: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
d1e0: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
d1f0: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
d200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
d210: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
d220: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
d230: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
d240: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
d250: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
d260: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 44 62  ssert( pIdx->iDb
d270: 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20  ==pTab->iDb );. 
d280: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
d290: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
d2a0: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
d2b0: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
d2c0: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
d2d0: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
d2e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
d2f0: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 20 72   iLargest==0 ) r
d300: 65 74 75 72 6e 3b 0a 20 20 20 20 64 65 73 74 72  eturn;.    destr
d310: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
d320: 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 70 54 61  e, iLargest, pTa
d330: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 44 65  b->iDb);.    iDe
d340: 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65  stroyed = iLarge
d350: 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  st;.  }.#endif.}
d360: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d370: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
d380: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
d390: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
d3a0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
d3b0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
d3c0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
d3d0: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
d3e0: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
d3f0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
d400: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
d410: 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
d420: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
d430: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
d440: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d450: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
d460: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
d470: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
d480: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
d490: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
d4a0: 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ble;.  assert( p
d4b0: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
d4c0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
d4d0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
d4e0: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
d4f0: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
d500: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
d510: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
d520: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
d530: 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70  table;.  iDb = p
d540: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  Tab->iDb;.  asse
d550: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
d560: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66  b<db->nDb );.#if
d570: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d580: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
d590: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
d5a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d5b0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
d5c0: 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b  ABLE(pTab->iDb);
d5d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d5e0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
d5f0: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
d600: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d610: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
d620: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
d630: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
d640: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
d650: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
d660: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
d670: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
d680: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
d690: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
d6a0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
d6b0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
d6c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d6d0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
d6e0: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
d6f0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d700: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
d710: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
d720: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
d730: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
d740: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
d750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d760: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
d770: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
d780: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
d790: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
d7a0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
d7b0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
d7c0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
d7d0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
d7e0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
d7f0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
d800: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
d810: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
d820: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
d830: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
d840: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
d850: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
d860: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
d870: 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e  ly || pTab==db->
d880: 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62  aDb[iDb].pSeqTab
d890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d8a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d8b0: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
d8c0: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
d8d0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
d8e0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
d8f0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
d900: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d910: 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
d920: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
d930: 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
d940: 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
d950: 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
d960: 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
d970: 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
d980: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
d990: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
d9a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d9b0: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
d9c0: 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
d9d0: 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
d9e0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
d9f0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
da00: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
da10: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
da20: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
da30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
da40: 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
da50: 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
da60: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
da70: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
da80: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
da90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
daa0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
dab0: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
dac0: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
dad0: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
dae0: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
daf0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
db00: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
db10: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
db20: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 69 6e 74  Trigger;.    int
db30: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
db40: 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  ;.    Db *pDb = 
db50: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
db60: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
db70: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
db80: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
db90: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
dba0: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
dbb0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
dbc0: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
dbd0: 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
dbe0: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
dbf0: 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
dc00: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
dc10: 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
dc20: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
dc30: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
dc40: 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
dc50: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
dc60: 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  er;.    while( p
dc70: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
dc80: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
dc90: 72 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70  r->iDb==iDb || p
dca0: 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20  Trigger->iDb==1 
dcb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dcc0: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
dcd0: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c  Parse, pTrigger,
dce0: 20 31 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67   1);.      pTrig
dcf0: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
dd00: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69  pNext;.    }..#i
dd10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dd20: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
dd30: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
dd40: 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
dd50: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
dd60: 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
dd70: 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68  d with.    ** th
dd80: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
dd90: 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
dda0: 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
ddb0: 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
ddc0: 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74      ** at the bt
ddd0: 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
dde0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
ddf0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
de00: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76  ds to.    ** mov
de10: 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
de20: 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
de30: 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
de40: 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20  cuum mode)..    
de50: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
de60: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
de70: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
de80: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
de90: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
dea0: 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %s.sqlite_sequ
deb0: 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
dec0: 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  %Q",.        pDb
ded0: 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
dee0: 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
def0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
df00: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
df10: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
df20: 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
df30: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
df40: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
df50: 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
df60: 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
df70: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
df80: 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
df90: 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
dfa0: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
dfb0: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
dfc0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
dfd0: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
dfe0: 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
dff0: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
e000: 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
e010: 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
e020: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
e030: 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
e040: 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
e050: 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
e060: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
e070: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
e080: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
e090: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
e0a0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
e0b0: 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
e0c0: 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
e0d0: 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
e0e0: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
e0f0: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
e100: 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
e110: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
e120: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
e130: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
e140: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
e150: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
e160: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
e170: 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
e180: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
e190: 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
e1a0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
e1b0: 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ie..    */.    s
e1c0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
e1d0: 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
e1e0: 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  Db, 0, pTab->zNa
e1f0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
e200: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
e210: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d  db, v, iDb);.  }
e220: 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
e230: 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
e240: 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
e250: 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
e260: 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
e270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
e280: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e290: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
e2a0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
e2b0: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
e2c0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
e2d0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
e2e0: 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
e2f0: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
e300: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
e310: 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
e320: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
e330: 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
e340: 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
e350: 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
e360: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
e370: 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
e380: 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
e390: 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
e3a0: 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
e3b0: 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
e3c0: 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
e3d0: 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
e3e0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
e3f0: 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
e400: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
e410: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
e420: 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
e430: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
e440: 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
e450: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
e460: 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
e470: 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
e480: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
e490: 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
e4a0: 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
e4b0: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
e4c0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
e4d0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
e4e0: 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
e4f0: 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20  ewTable field.  
e500: 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20  The new FKey.** 
e510: 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e  is not linked in
e520: 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20  to db->aFKey at 
e530: 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61  this point - tha
e540: 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  t does not happe
e550: 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74  n.** until sqlit
e560: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a  e3EndTable()..**
e570: 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
e580: 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
e590: 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
e5a0: 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
e5b0: 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
e5c0: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
e5d0: 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
e5e0: 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
e5f0: 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
e600: 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
e610: 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
e620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
e630: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e640: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e650: 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
e660: 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
e670: 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
e680: 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
e690: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
e6a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
e6b0: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
e6c0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
e6d0: 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
e6e0: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
e6f0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
e700: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
e710: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
e720: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
e730: 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69  rithms. */.){.#i
e740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e750: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
e760: 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
e770: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
e780: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
e790: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
e7a0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
e7b0: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
e7c0: 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
e7d0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
e7e0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
e7f0: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
e800: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
e810: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
e820: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
e830: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74  if( iCol<0 ) got
e840: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
e850: 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
e860: 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
e870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
e880: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
e890: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
e8a0: 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
e8b0: 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
e8c0: 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
e8d0: 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
e8e0: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
e8f0: 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
e900: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
e910: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
e920: 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
e930: 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
e940: 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
e950: 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
e960: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e970: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
e980: 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
e990: 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
e9a0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
e9b0: 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
e9c0: 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
e9d0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
e9e0: 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
e9f0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
ea00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
ea10: 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
ea20: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
ea30: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
ea40: 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  y) + nCol*sizeof
ea50: 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
ea60: 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
ea70: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
ea80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
ea90: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
eaa0: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
eab0: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
eac0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
ead0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
eae0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
eaf0: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  oc( nByte );.  i
eb00: 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f  f( pFKey==0 ) go
eb10: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b  to fk_end;.  pFK
eb20: 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
eb30: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
eb40: 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
eb50: 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
eb60: 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61  y[1];.  pFKey->a
eb70: 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43  Col = (struct sC
eb80: 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d  olMap*)z;.  z +=
eb90: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
eba0: 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20  ColMap)*nCol;.  
ebb0: 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
ebc0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
ebd0: 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
ebe0: 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
ebf0: 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
ec00: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
ec10: 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  = 0;.  pFKey->nC
ec20: 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
ec30: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
ec40: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
ec50: 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
ec60: 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
ec70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ec80: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ec90: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
eca0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
ecb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
ecc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ecd0: 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
ece0: 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
ecf0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
ed00: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
ed10: 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
ed20: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
ed30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ed40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ed50: 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
ed60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
ed70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
ed80: 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
ed90: 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
eda0: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
edb0: 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
edc0: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
edd0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
ede0: 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
edf0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
ee00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
ee10: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
ee20: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ee30: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
ee40: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
ee50: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
ee60: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
ee70: 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
ee80: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
ee90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
eea0: 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
eeb0: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
eec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
eed0: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
eee0: 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
eef0: 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73  leteConf = flags
ef00: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
ef10: 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28  ->updateConf = (
ef20: 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
ef30: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  xff;.  pFKey->in
ef40: 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67  sertConf = (flag
ef50: 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
ef60: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
ef70: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
ef80: 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
ef90: 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
efa0: 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
efb0: 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
efc0: 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
efd0: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
efe0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
eff0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
f000: 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
f010: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f020: 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29  Delete(pFromCol)
f030: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
f040: 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c  istDelete(pToCol
f050: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
f060: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f070: 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
f080: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
f090: 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
f0a0: 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
f0b0: 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
f0c0: 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
f0d0: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
f0e0: 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
f0f0: 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
f100: 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
f110: 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
f120: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
f130: 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
f140: 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
f150: 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
f160: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
f170: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
f180: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
f190: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
f1a0: 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
f1b0: 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
f1c0: 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
f1d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
f1e0: 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
f1f0: 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
f200: 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
f210: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
f220: 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
f230: 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
f240: 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
f250: 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
f260: 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64  red = isDeferred
f270: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
f280: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f290: 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
f2a0: 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
f2b0: 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
f2c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
f2d0: 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
f2e0: 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
f2f0: 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
f300: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
f310: 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
f320: 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
f330: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
f340: 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
f350: 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
f360: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
f370: 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
f380: 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
f390: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70  e memory cell sp
f3a0: 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
f3b0: 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
f3c0: 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
f3d0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
f3e0: 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
f3f0: 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
f400: 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
f410: 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
f420: 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
f430: 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
f440: 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
f450: 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
f460: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
f470: 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
f480: 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
f490: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
f4a0: 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
f4b0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
f4c0: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
f4d0: 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
f4e0: 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
f4f0: 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
f500: 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
f510: 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
f520: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
f530: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
f540: 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
f550: 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
f560: 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
f570: 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
f580: 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b+1;     /* Btre
f590: 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
f5a0: 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
f5b0: 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f5d0: 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
f5e0: 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
f5f0: 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
f600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
f610: 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
f620: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
f650: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
f660: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
f670: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f680: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
f690: 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
f6a0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
f6b0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
f6c0: 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
f6d0: 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61  me, 0,.      pPa
f6e0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 70 49 6e  rse->db->aDb[pIn
f6f0: 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 20  dex->iDb].zName 
f700: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
f710: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
f720: 2a 20 45 6e 73 75 72 65 20 61 6c 6c 20 74 68 65  * Ensure all the
f730: 20 72 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74   required collat
f740: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72  ion sequences ar
f750: 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69  e available. Thi
f760: 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 77  s.  ** routine w
f770: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ill invoke the c
f780: 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20  ollation-needed 
f790: 63 61 6c 6c 62 61 63 6b 20 69 66 20 6e 65 63 65  callback if nece
f7a0: 73 73 61 72 79 20 28 61 6e 64 0a 20 20 2a 2a 20  ssary (and.  ** 
f7b0: 69 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20  if one has been 
f7c0: 72 65 67 69 73 74 65 72 65 64 29 2e 0a 20 20 2a  registered)..  *
f7d0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43  /.  if( sqlite3C
f7e0: 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71  heckIndexCollSeq
f7f0: 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
f800: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
f810: 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
f820: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f830: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
f840: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
f850: 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
f860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f870: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
f880: 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c  ad, memRootPage,
f890: 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20   0);.    tnum = 
f8a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
f8b0: 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
f8c0: 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
f8d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f8e0: 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e  Clear, tnum, pIn
f8f0: 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20  dex->iDb);.  }. 
f900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f910: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
f920: 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29   pIndex->iDb, 0)
f930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  ;.  sqlite3VdbeO
f940: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
f950: 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a  te, iIdx, tnum,.
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64      (char*)&pInd
f980: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  ex->keyInfo, P3_
f990: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
f9a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f9b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
f9c0: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  ->iDb, 0);.  sql
f9d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f9e0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
f9f0: 61 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b  ab, pTab->tnum);
fa00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
fa10: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
fa20: 43 6f 6c 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70  Columns, iTab, p
fa30: 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 61 64  Tab->nCol);.  ad
fa40: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
fa50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
fa60: 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
fa70: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
fa80: 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64  IndexKey(v, pInd
fa90: 65 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28  ex, iTab);.  if(
faa0: 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
fab0: 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
fac0: 20 69 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73   int curaddr = s
fad0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
fae0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e  tAddr(v);.    in
faf0: 74 20 61 64 64 72 32 20 3d 20 63 75 72 61 64 64  t addr2 = curadd
fb00: 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+4;.    sqlite3
fb10: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
fb20: 63 75 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32  curaddr-1, addr2
fb30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fb40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
fb50: 77 69 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  wid, iTab, 0);. 
fb60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb70: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
fb80: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
fb90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fba0: 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49   OP_IsUnique, iI
fbb0: 64 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  dx, addr2);.    
fbc0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
fbd0: 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
fbe0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45  E_CONSTRAINT, OE
fbf0: 5f 41 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  _Abort,.        
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64              "ind
fc10: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
fc20: 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
fc30: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73  _STATIC);.    as
fc40: 73 65 72 74 28 20 61 64 64 72 32 3d 3d 73 71 6c  sert( addr2==sql
fc50: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
fc60: 64 64 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20  ddr(v) );.  }.  
fc70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc80: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
fc90: 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71  , iIdx, 0);.  sq
fca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fcb0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
fcc0: 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c   addr1+1);.  sql
fcd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
fce0: 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c 69 74  (v, addr1, sqlit
fcf0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fd00: 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(v));.  sqlite3
fd10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fd20: 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30 29 3b  Close, iTab, 0);
fd30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
fd40: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
fd50: 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a   iIdx, 0);.}../*
fd60: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
fd70: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
fd80: 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
fd90: 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
fda0: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
fdb0: 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
fdc0: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
fdd0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
fde0: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
fdf0: 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
fe00: 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
fe10: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
fe20: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
fe30: 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
fe40: 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
fe50: 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
fe60: 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
fe70: 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
fe80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
fe90: 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
fea0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
feb0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
fec0: 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
fed0: 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
fee0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
fef0: 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
ff00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
ff10: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
ff20: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
ff30: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
ff40: 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
ff50: 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
ff60: 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
ff70: 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
ff80: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
ff90: 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
ffa0: 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
ffb0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
ffc0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
ffd0: 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
ffe0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
fff0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10000 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
10010 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10020 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
10030 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
10040 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
10050 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
10060 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
10070 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
10080 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
10090 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
100a0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
100b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
100c0 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
100d0 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
100e0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
100f0 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
10100 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
10110 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
10120 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
10130 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
10140 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
10150 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
10160 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
10170 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
10180 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
10190 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
101a0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
101b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
101c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
101d0 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f  n *pEnd        /
101e0 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
101f0 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
10200 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
10210 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
10220 70 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54  pTab = 0;   /* T
10230 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
10240 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
10250 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68  Index = 0; /* Th
10260 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
10270 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
10280 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
10290 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
102a0 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61  nullId;    /* Fa
102b0 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
102c0 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
102d0 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
102e0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
102f0 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
10300 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
10310 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
10320 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
10330 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
10340 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
10350 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
10360 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
10370 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10380 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61  me = 0; /* Unqua
10390 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
103a0 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
103b0 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  te */..  if( pPa
103c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
103d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
103e0 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
103f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
10400 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
10410 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
10420 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
10430 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
10440 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
10450 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
10460 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
10470 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
10480 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
10490 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
104a0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
104b0 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
104c0 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
104d0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
104e0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
104f0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
10500 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
10510 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
10520 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
10530 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
10540 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
10550 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
10560 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
10570 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
10580 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10590 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ex;..#ifndef SQL
105a0 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
105b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
105c0 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
105d0 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
105e0 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65  if the the table
105f0 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
10600 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
10610 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
10620 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20   to 1..    */.  
10630 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
10640 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
10650 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
10660 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20  .    if( pName2 
10670 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  && pName2->n==0 
10680 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
10690 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20  >iDb==1 ){.     
106a0 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   iDb = 1;.    }.
106b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
106c0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
106d0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
106e0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
106f0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
10700 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
10710 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
10720 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
10730 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10740 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
10750 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
10760 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
10770 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
10780 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
10790 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
107a0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
107b0 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
107c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
107d0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
107e0 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
107f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10800 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
10810 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
10820 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10830 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62  ;.    iDb = pTab
10840 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66  ->iDb;.  }..  if
10850 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
10860 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
10870 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10880 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
10890 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
108a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
108b0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
108c0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
108d0 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
108e0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
108f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10900 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
10910 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
10920 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
10930 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
10940 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10950 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
10960 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
10970 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
10980 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
10990 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
109a0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
109b0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
109c0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
109d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
109e0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
109f0 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
10a00 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
10a10 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
10a20 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
10a30 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
10a40 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
10a50 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
10a60 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
10a70 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
10a80 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
10a90 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
10aa0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
10ab0 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
10ac0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
10ad0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
10ae0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
10af0 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
10b00 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
10b10 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
10b20 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
10b30 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
10b40 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
10b50 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
10b60 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
10b70 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
10b80 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
10b90 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
10ba0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
10bb0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
10bc0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
10bd0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
10be0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
10bf0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
10c00 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
10c10 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
10c20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
10c30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
10c40 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
10c50 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10c60 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
10c70 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
10c80 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
10c90 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
10ca0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
10cb0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10cc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
10cd0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
10ce0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61       Index *pISa
10cf0 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
10d00 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
10d10 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
10d20 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
10d30 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
10d40 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
10d50 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
10d60 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
10d70 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
10d80 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
10d90 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
10da0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10db0 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61  .      if( (pISa
10dc0 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
10dd0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
10de0 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
10df0 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a  ].zName))!=0 ){.
10e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10e10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10e20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
10e30 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
10e40 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
10e50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10e60 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
10e70 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
10e80 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
10e90 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
10ea0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
10eb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10ec0 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
10ed0 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
10ee0 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
10ef0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
10f00 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10f10 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
10f20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
10f30 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
10f40 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
10f50 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
10f60 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
10f70 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
10f80 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
10f90 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
10fa0 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
10fb0 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a  ,"_%d",n);.    z
10fc0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Name = 0;.    sq
10fd0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
10fe0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
10ff0 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62  utoindex_", pTab
11000 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28  ->zName, zBuf, (
11010 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66  char*)0);.    if
11020 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
11030 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11040 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  dex;.  }..  /* C
11050 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
11060 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
11070 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
11080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11090 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
110a0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
110b0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
110c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
110d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
110e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
110f0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
11100 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
11110 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
11120 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
11130 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11140 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
11150 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
11160 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
11170 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
11180 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
11190 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
111a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
111b0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
111c0 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
111d0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
111e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
111f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11200 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
11210 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
11220 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
11230 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
11240 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
11250 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
11260 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
11270 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
11280 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
11290 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
112a0 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
112b0 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
112c0 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
112d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
112e0 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
112f0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
11300 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
11310 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
11320 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
11330 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
11340 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
11350 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
11360 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
11370 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11380 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
11390 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
113a0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
113b0 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
113c0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
113d0 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
113e0 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a  ndex) + strlen(z
113f0 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20  Name) + 1 +.    
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29      (sizeof(int)
11420 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   + sizeof(CollSe
11430 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  q*))*pList->nExp
11440 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  r );.  if( sqlit
11450 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
11460 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11470 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e  ate_index;.  pIn
11480 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
11490 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  (int*)&pIndex->k
114a0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69  eyInfo.aColl[pLi
114b0 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49  st->nExpr];.  pI
114c0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
114d0 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
114e0 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45  Column[pList->nE
114f0 78 70 72 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  xpr];.  strcpy(p
11500 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
11510 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ame);.  pIndex->
11520 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
11530 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
11540 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
11550 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
11560 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  or = onError;.  
11570 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
11580 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20  x = pName==0;.  
11590 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 44  pIndex->iDb = iD
115a0 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68  b;..  /* Scan th
115b0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
115c0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
115d0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
115e0 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
115f0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
11600 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
11610 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
11620 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
11630 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
11640 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
11650 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11660 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
11670 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  ++){.    for(j=0
11680 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
11690 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
116a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
116b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
116c0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  , pTab->aCol[j].
116d0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
116e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
116f0 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
11700 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11710 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11720 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f  "table %s has no
11730 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73   column named %s
11740 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
11750 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61  >zName, pList->a
11760 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
11770 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
11780 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
11790 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
117a0 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
117b0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
117c0 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
117d0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
117e0 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  [i].pExpr->pColl
117f0 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   );.      pIndex
11800 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11810 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  i] = pList->a[i]
11820 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20  .pExpr->pColl;. 
11830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11840 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
11850 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d  aColl[i] = pTab-
11860 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a  >aCol[j].pColl;.
11870 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
11880 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  ( pIndex->keyInf
11890 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20  o.aColl[i] );.  
118a0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
118b0 62 75 73 79 20 26 26 20 0a 20 20 20 20 20 20 20  busy && .       
118c0 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
118d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e  lSeq(pParse, pIn
118e0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
118f0 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b 0a 20  ll[i]) .    ){. 
11900 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11910 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11920 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d   }.  }.  pIndex-
11930 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20  >keyInfo.nField 
11940 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
11950 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
11960 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
11970 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
11980 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
11990 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
119a0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
119b0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
119c0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
119d0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
119e0 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
119f0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
11a00 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
11a10 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
11a20 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
11a30 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
11a40 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
11a50 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
11a60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
11a70 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
11a80 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
11a90 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
11aa0 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
11ab0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
11ac0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
11ad0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
11ae0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
11af0 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
11b00 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
11b10 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
11b20 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
11b30 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
11b40 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
11b50 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
11b60 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
11b70 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
11b80 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
11b90 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
11ba0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
11bb0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
11bc0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
11bd0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
11be0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
11bf0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
11c00 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
11c10 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
11c20 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
11c30 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
11c40 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
11c50 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
11c60 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
11c70 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
11c80 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d   pIdx->nColumn!=
11c90 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
11ca0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11cb0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
11cc0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  x->nColumn; k++)
11cd0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
11ce0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21  dx->aiColumn[k]!
11cf0 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
11d00 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n[k] ) break;.  
11d10 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
11d20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d  keyInfo.aColl[k]
11d30 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  !=pIndex->keyInf
11d40 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65  o.aColl[k] ) bre
11d50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11d60 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
11d70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
11d80 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
11d90 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
11da0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
11db0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
11dc0 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
11dd0 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
11de0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
11df0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
11e00 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
11e10 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
11e20 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
11e30 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
11e40 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
11e50 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
11e60 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
11e70 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
11e80 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
11e90 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
11ea0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
11eb0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
11ec0 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
11ed0 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
11ee0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
11ef0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
11f00 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
11f10 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
11f20 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
11f30 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
11f40 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
11f50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11f60 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
11f70 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
11f80 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
11f90 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
11fa0 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
11fb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11fc0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
11fe0 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
11ff0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
12000 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
12010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12020 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
12030 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
12040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12050 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
12060 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
12070 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
12090 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
120a0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
120b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
120c0 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
120d0 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
120e0 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
120f0 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
12100 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12110 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
12120 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
12130 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
12140 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
12150 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
12160 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64  rt(&db->aDb[pInd
12170 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  ex->iDb].idxHash
12180 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12190 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
121a0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
121b0 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  n(pIndex->zName)
121c0 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  +1, pIndex);.   
121d0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
121e0 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
121f0 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
12200 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
12210 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
12220 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
12240 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12250 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
12260 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
12270 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
12280 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
12290 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
122a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
122b0 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
122c0 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  y is 0 then crea
122d0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
122e0 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
122f0 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
12300 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
12310 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
12320 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
12330 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
12340 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
12350 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
12360 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
12370 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
12380 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
12390 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
123a0 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
123b0 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e  * command.  db->
123c0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77  init.busy is 1 w
123d0 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
123e0 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
123f0 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
12400 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
12410 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
12420 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
12430 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
12440 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
12450 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
12460 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
12470 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
12480 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
12490 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
124a0 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
124b0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
124c0 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
124d0 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
124e0 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
124f0 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
12500 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
12510 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
12520 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
12530 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
12540 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
12550 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
12560 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
12570 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
12580 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
12590 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
125a0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
125b0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
125c0 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
125d0 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
125e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
125f0 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  +;..    v = sqli
12600 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12610 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
12620 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
12630 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
12640 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
12650 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
12660 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
12670 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
12680 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
12690 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
126a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
126b0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
126c0 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  ex, iDb, 0);.   
126d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
126e0 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
126f0 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20  , iMem, 0);..   
12700 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
12710 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
12720 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
12730 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
12740 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
12750 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
12760 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
12770 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
12780 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
12790 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
127a0 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
127b0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
127c0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
127d0 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54  e3MPrintf("CREAT
127e0 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
127f0 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
12800 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
12810 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20   " UNIQUE",.    
12820 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e      pEnd->z - pN
12830 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20  ame->z + 1,.    
12840 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
12850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12860 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
12870 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
12880 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
12890 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
128a0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
128b0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
128c0 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
128d0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
128e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
128f0 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
12900 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
12910 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
12920 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
12930 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
12940 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
12950 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
12960 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
12970 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20  Q,#0,%Q);",.    
12980 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
12990 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
129a0 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
129b0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
129c0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
129d0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  zName,.        z
129e0 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
129f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a00 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
12a10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
12a20 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  e(zStmt);..    /
12a30 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
12a40 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
12a50 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
12a60 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
12a70 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
12a80 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
12a90 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
12aa0 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
12ab0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
12ac0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
12ad0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
12ae0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
12af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
12b00 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
12b10 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  v, iDb);.      s
12b20 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
12b30 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
12b40 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20   iDb, 0,.       
12b50 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
12b60 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49  ("name='%q'", pI
12b70 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33  ndex->zName), P3
12b80 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
12b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12ba0 70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  p(v, OP_Expire, 
12bb0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
12bc0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
12bd0 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
12be0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
12bf0 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
12c00 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
12c10 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
12c20 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
12c30 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
12c40 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
12c50 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
12c60 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
12c70 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
12c80 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
12c90 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
12ca0 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  T..  */.  if( db
12cb0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
12cc0 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
12cd0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
12ce0 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
12cf0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
12d00 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
12d10 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
12d20 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
12d30 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
12d40 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
12d50 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
12d60 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
12d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
12d80 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
12d90 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
12da0 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
12db0 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
12dc0 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
12dd0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
12de0 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
12df0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
12e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
12e10 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
12e20 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
12e30 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
12e40 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
12e50 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  }.    pIndex = 0
12e60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
12e70 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
12e80 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
12e90 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
12ea0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72  pIndex ){.    fr
12eb0 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
12ec0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
12ed0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
12ee0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
12ef0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c  cListDelete(pTbl
12f00 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
12f10 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
12f20 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
12f30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12f40 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
12f50 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
12f60 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
12f70 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
12f80 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
12f90 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
12fa0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
12fb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
12fc0 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
12fd0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
12fe0 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
12ff0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13000 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
13010 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
13020 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
13030 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
13040 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13050 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
13060 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
13070 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13080 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
13090 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
130a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
130b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
130c0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
130d0 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
130e0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
130f0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13100 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
13110 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
13120 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13130 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
13140 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
13150 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
13160 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
13170 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
13180 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
13190 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
131a0 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
131b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
131c0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
131d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
131e0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
131f0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
13200 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
13210 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
13220 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13230 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
13240 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13250 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13260 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
13270 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13280 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
13290 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
132a0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
132b0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
132c0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
132d0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
132e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
132f0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
13300 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
13310 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13320 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13330 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
13340 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
13350 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13360 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
13370 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
13380 4d 50 44 42 20 26 26 20 70 49 6e 64 65 78 2d 3e  MPDB && pIndex->
13390 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
133a0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
133b0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
133c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
133d0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
133e0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
133f0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
13400 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13410 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
13420 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13430 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13440 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
13450 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
13460 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
13470 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
13480 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13490 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
134a0 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d  nt iDb = pIndex-
134b0 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
134c0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
134d0 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
134e0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
134f0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
13500 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
13510 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
13520 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
13530 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
13540 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
13550 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
13560 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
13570 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
13580 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
13590 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
135a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
135b0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
135c0 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78  , iDb, 0, pIndex
135d0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
135e0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
135f0 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
13600 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
13610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
13620 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
13630 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
13640 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
13650 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
13660 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
13670 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
13680 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
13690 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
136a0 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
136b0 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
136c0 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
136d0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
136e0 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
136f0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
13700 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
13710 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
13720 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
13730 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
13740 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
13750 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
13760 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d  ist->nId>=pList-
13770 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73  >nAlloc ){.    s
13780 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
13790 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d  m *a;.    pList-
137a0 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d  >nAlloc = pList-
137b0 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20  >nAlloc*2 + 5;. 
137c0 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
137d0 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
137e0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
137f0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
13800 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
13810 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13820 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
13830 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
13840 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
13850 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
13860 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73  }.  memset(&pLis
13870 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
13880 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
13890 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69  t->a[0]));.  pLi
138a0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
138b0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
138c0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
138d0 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d  Token);.  pList-
138e0 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
138f0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
13900 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
13910 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
13920 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
13930 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
13940 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
13950 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
13960 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
13970 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
13980 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
13990 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
139a0 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
139b0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
139c0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
139d0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
139e0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
139f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13a00 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
13a10 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
13a20 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
13a30 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
13a40 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
13a50 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
13a60 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
13a70 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
13a80 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
13a90 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13aa0 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
13ab0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
13ac0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
13ad0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
13ae0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
13af0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
13b00 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
13b10 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
13b20 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
13b30 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
13b40 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
13b50 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
13b60 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
13b70 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
13b80 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
13b90 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
13ba0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
13bb0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
13bc0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
13bd0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
13be0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
13bf0 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
13c00 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
13c10 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
13c20 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
13c30 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
13c40 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
13c50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
13c60 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
13c70 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
13c80 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
13c90 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
13ca0 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
13cb0 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
13cc0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
13cd0 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73  istAppend(SrcLis
13ce0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
13cf0 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a  *pTable, Token *
13d00 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74  pDatabase){.  st
13d10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13d20 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
13d30 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
13d40 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
13d50 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63  lloc( sizeof(Src
13d60 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
13d70 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13d80 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
13d90 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d  >nAlloc = 1;.  }
13da0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53  .  if( pList->nS
13db0 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rc>=pList->nAllo
13dc0 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
13dd0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73   *pNew;.    pLis
13de0 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
13df0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
13e00 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a  eRealloc(pList,.
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13e20 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
13e30 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
13e40 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
13e50 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
13e60 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
13e70 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
13e80 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
13e90 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
13ea0 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
13eb0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74   pNew;.  }.  pIt
13ec0 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
13ed0 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d  List->nSrc];.  m
13ee0 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
13ef0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
13f00 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
13f10 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
13f20 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
13f30 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
13f40 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
13f50 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
13f60 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
13f70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
13f80 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
13f90 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
13fa0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
13fb0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
13fc0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
13fd0 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70  ken(pTable);.  p
13fe0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
13ff0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14000 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65  mToken(pDatabase
14010 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72  );.  pItem->iCur
14020 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73  sor = -1;.  pLis
14030 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74  t->nSrc++;.  ret
14040 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
14050 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f  .** Assign curso
14060 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
14070 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
14080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
14090 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
140a0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
140b0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
140c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
140d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
140e0 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 69   *pItem;.  for(i
140f0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
14100 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  >a; i<pList->nSr
14110 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
14120 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  {.    if( pItem-
14130 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
14140 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  eak;.    pItem->
14150 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
14160 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
14170 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
14180 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14190 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
141a0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
141b0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
141c0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rc);.    }.  }.}
141d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
141e0 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
141f0 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
14200 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
14210 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
14220 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
14230 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74  AddAlias(SrcList
14240 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
14250 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
14260 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e  List && pList->n
14270 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69  Src>0 ){.    pLi
14280 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
14290 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71  c-1].zAlias = sq
142a0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
142b0 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  en(pToken);.  }.
142c0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
142d0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
142e0 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
142f0 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
14300 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
14310 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14320 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14330 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
14340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
14350 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
14360 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
14370 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
14380 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
14390 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
143a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
143b0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
143c0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
143d0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
143e0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
143f0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
14400 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
14410 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
14420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14430 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
14440 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
14450 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
14460 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
14470 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
14480 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
14490 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
144a0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
144b0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
144c0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
144d0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
144e0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
144f0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
14500 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
14510 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
14520 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
14530 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
14540 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
14550 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
14560 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14570 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
14580 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
14590 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
145a0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
145b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
145c0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
145d0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
145e0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
145f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
14600 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
14610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
14620 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
14630 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
14640 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14650 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
14660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14670 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
14680 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
14690 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
146a0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
146b0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
146c0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
146d0 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
146e0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
146f0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
14700 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
14710 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
14720 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14730 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
14740 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14750 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14760 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14770 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14780 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14790 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
147a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
147b0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
147c0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
147d0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
147e0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
147f0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
14800 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
14810 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14820 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
14830 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14840 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
14850 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
14860 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14870 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
14880 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14890 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
148a0 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
148b0 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  SIVE)+1);.    }.
148c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
148d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
148e0 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
148f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
14900 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
14910 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
14920 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
14930 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14940 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14950 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
14960 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14970 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14980 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14990 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
149a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
149b0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
149c0 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
149d0 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
149e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
149f0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14a00 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
14a10 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14a20 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14a30 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14a40 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
14a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a60 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
14a70 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
14a80 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
14a90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
14aa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
14ab0 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
14ac0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
14ad0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
14ae0 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
14af0 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
14b00 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
14b10 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
14b20 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
14b30 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
14b40 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
14b50 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
14b60 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
14b70 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14b80 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
14b90 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
14ba0 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
14bb0 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
14bc0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14bd0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
14be0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14bf0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
14c00 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
14c10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
14c20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
14c30 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
14c40 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
14c50 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
14c60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
14c70 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
14c80 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
14c90 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
14ca0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
14cb0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  tic int sqlite3O
14cc0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
14cd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
14ce0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14cf0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
14d00 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
14d10 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
14d20 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
14d30 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
14d40 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
14d50 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
14d60 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
14d70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14d90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14da0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
14db0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
14dc0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
14dd0 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
14de0 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
14df0 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
14e00 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
14e10 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
14e20 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
14e30 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
14e40 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
14e50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
14e60 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
14e70 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
14e80 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
14e90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14eb0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14ec0 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
14ed0 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
14ee0 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
14ef0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
14f00 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
14f10 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
14f20 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
14f30 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
14f40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
14f50 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
14f60 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
14f70 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
14f80 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
14f90 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
14fa0 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
14fb0 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
14fc0 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
14fd0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
14fe0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
14ff0 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
15000 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
15010 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
15020 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
15030 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
15040 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
15050 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
15060 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
15070 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
15080 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
15090 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
150a0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
150b0 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
150c0 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
150d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
150e0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
150f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
15100 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
15110 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
15120 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
15130 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
15140 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
15150 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
15160 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
15170 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
15180 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
15190 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
151a0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
151b0 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
151c0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
151d0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
151e0 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
151f0 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
15200 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
15210 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
15220 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
15230 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
15240 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
15250 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
15260 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
15270 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
15280 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
15290 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
152a0 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
152b0 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
152c0 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
152d0 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
152e0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
152f0 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
15300 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
15310 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
15320 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
15330 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
15340 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
15350 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
15360 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
15370 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
15380 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
15390 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
153a0 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
153b0 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
153c0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
153d0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
153e0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
153f0 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
15400 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
15410 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
15420 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
15430 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15440 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
15450 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
15460 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
15470 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
15480 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
15490 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
154a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
154b0 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
154c0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
154d0 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
154e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
154f0 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
15500 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
15510 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
15520 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
15530 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
15540 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
15550 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
15560 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20  ert( iDb<32 );. 
15570 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
15580 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
15590 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
155a0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
155b0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
155c0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
155d0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
155e0 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
155f0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
15600 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
15610 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
15620 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
15630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
15640 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
15650 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
15660 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15670 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
15680 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
15690 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
156a0 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
156b0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
156c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
156d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
156e0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
156f0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
15700 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
15710 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
15720 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
15730 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
15740 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
15750 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
15760 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
15770 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
15780 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
15790 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
157a0 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
157b0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
157c0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
157d0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
157e0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
157f0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
15800 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
15810 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
15820 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
15830 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
15840 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
15850 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
15860 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
15870 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
15880 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
15890 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
158a0 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
158b0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
158c0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
158d0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
158e0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
158f0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
15900 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
15910 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  set..**.** Only 
15920 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64  database iDb and
15930 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15940 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
15950 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c  able by this cal
15960 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c  l..** If iDb==0,
15970 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61   then the main a
15980 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  nd temp database
15990 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  s are made writa
159a0 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62  ble.   If.** iDb
159b0 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  ==1 then only th
159c0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
159d0 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
159e0 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e  .  If iDb>1 then
159f0 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
15a00 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  d auxiliary data
15a10 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d  base and the tem
15a20 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
15a30 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ade writable..*/
15a40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
15a50 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
15a60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15a70 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
15a80 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
15a90 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
15aa0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15ab0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
15ac0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  urn;.  sqlite3Co
15ad0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
15ae0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
15af0 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
15b00 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66   |= 1<<iDb;.  if
15b10 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26  ( setStatement &
15b20 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
15b30 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
15b40 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15b50 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62  P_Statement, iDb
15b60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
15b70 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  (OMIT_TEMPDB || 
15b80 69 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73  iDb!=1) && pPars
15b90 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  e->db->aDb[1].pB
15ba0 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t!=0 ){.    sqli
15bb0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
15bc0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73  ration(pParse, s
15bd0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b  etStatement, 1);
15be0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
15bf0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
15c00 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
15c10 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
15c20 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
15c30 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
15c40 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
15c50 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
15c60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15c70 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
15c80 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
15c90 4d 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70  Match(CollSeq *p
15ca0 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
15cb0 64 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  dex){.  int n = 
15cc0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
15cd0 6e 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65  nField;.  CollSe
15ce0 71 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d  q **pp = pIndex-
15cf0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a  >keyInfo.aColl;.
15d00 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a    while( n-- ){.
15d10 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f      if( *pp==pCo
15d20 6c 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ll ) return 1;. 
15d30 20 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72     pp++;.  }.  r
15d40 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
15d50 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
15d60 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
15d70 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
15d80 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
15d90 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
15da0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
15db0 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
15dc0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
15dd0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15de0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
15df0 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
15e00 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15e10 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f   Table *pTab, Co
15e20 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
15e30 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e50 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
15e60 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
15e70 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
15e80 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
15e90 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
15ea0 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
15eb0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( pColl==0 || 
15ec0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70  collationMatch(p
15ed0 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a  Coll,pIndex) ){.
15ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
15ef0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
15f00 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62  (pParse, 0, pTab
15f10 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  ->iDb);.      sq
15f20 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
15f30 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
15f40 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
15f50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15f60 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
15f70 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
15f80 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
15f90 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
15fa0 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
15fb0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
15fc0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
15fd0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
15fe0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
15ff0 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
16000 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
16010 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
16020 58 0a 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  X.void reindexDa
16030 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
16040 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a  Parse, CollSeq *
16050 70 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  pColl){.  Db *pD
16060 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16070 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
16080 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
16090 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
160a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
160b0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
160c0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
160d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
160e0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
160f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16100 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
16110 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
16120 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
16130 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
16140 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
16150 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
16160 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
16170 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
16180 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
16190 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
161a0 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
161b0 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
161c0 20 20 69 66 28 20 70 44 62 3d 3d 30 20 29 20 63    if( pDb==0 ) c
161d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
161e0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
161f0 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  irst(&pDb->tblHa
16200 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
16210 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
16220 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
16230 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
16240 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
16250 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
16260 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a  , pTab, pColl);.
16270 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
16280 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
16290 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
162a0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
162b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
162c0 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
162f0 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
16300 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
16310 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
16320 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
16330 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
16340 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
16350 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
16360 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
16370 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
16380 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
16390 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
163a0 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
163b0 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
163c0 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
163d0 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
163e0 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
163f0 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
16400 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
16410 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
16420 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
16430 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
16440 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
16450 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
16460 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
16470 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
16480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16490 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
164a0 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
164b0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
164c0 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
164d0 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
164e0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
164f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
16500 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
16510 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
16520 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
16530 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
16540 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16550 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
16560 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
16570 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
16580 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16590 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
165a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
165c0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
165d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
165e0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
165f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16600 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16610 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
16620 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
16630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16640 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
16650 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
16660 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16670 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
16680 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16690 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
166a0 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
166b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
166c0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
166d0 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
166e0 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
166f0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
16700 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
16710 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
16720 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
16730 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
16740 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
16750 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
16760 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
16770 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
16780 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
16790 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
167a0 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20  f( pName1==0 || 
167b0 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName1->z==0 ){.
167c0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
167d0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
167e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
167f0 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d  else if( pName2=
16800 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  =0 || pName2->z=
16810 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
16820 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
16830 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65 6e 63  lSeq(db, db->enc
16840 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61  , pName1->z, pNa
16850 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  me1->n, 0);.    
16860 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
16870 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
16880 73 65 73 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  ses(pParse, pCol
16890 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
168a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44  ;.    }.  }.  iD
168b0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
168c0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
168d0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
168e0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
168f0 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
16900 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
16910 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a  meFromToken(pObj
16920 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64  Name);.  zDb = d
16930 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
16940 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
16950 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
16960 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
16970 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
16980 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
16990 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
169a0 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
169b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
169c0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
169d0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
169e0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46   zDb);.  sqliteF
169f0 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49  ree(z);.  if( pI
16a00 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
16a10 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16a20 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
16a30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16a40 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
16a50 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
16a60 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
16a70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
16a80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
16a90 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
16aa0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
16ab0 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
16ac0 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.