/ Hex Artifact Content
Login

Artifact 6481b728788829e57d2ad6f765cb2dc82ced9d8e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 34 30 20 32 30 30 35 2f 30 38 2f 31 34  1.340 2005/08/14
02f0: 20 30 31 3a 33 34 3a 32 30 20 64 72 68 20 45 78   01:34:20 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
05e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0600: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0610: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0620: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0630: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0650: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0660: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0670: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0680: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0690: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
06a0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
06b0: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
06c0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
06d0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
06e0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
06f0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0700: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0710: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
0720: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
0730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0740: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
0750: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
0760: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
0770: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0780: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0790: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
07a0: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
07b0: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
07c0: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
07d0: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
07e0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
07f0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
0800: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0810: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
0820: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
0830: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
0840: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
0850: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
0860: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
0870: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0880: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0890: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
08a0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
08b0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
08c0: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
08d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
08e0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
08f0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0900: 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  to-1, sqlite3Vdb
0910: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
0920: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
0930: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
0940: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
0950: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
0960: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
0970: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
0980: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
0990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
09a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
09b0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
09c0: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
09d0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
09e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
09f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0a00: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
0a10: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
0a20: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
0a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
0a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0a50: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
0a60: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
0a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0a80: 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74  Add a No-op that
0a90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
0aa0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
0ab0: 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a  he compiled SQL.
0ac0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
0ad0: 20 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d   as its P3 argum
0ae0: 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20  ent.  This does 
0af0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66  not change the f
0b00: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
0b10: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
0b20: 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  am. .    **.    
0b30: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
0b40: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  to implement sql
0b50: 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20  ite3_trace()..  
0b60: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
0b70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  VdbeOp3(v, OP_No
0b80: 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65  op, 0, 0, pParse
0b90: 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e  ->zSql, pParse->
0ba0: 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53  zTail-pParse->zS
0bb0: 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ql);.  }...  /* 
0bc0: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
0bd0: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
0be0: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
0bf0: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0c00: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
0c10: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
0c20: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0c30: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
0c40: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
0c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
0c60: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
0c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
0c80: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
0c90: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
0ca0: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
0cd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70   pParse->nMaxDep
0ce0: 74 68 2b 31 2c 20 70 50 61 72 73 65 2d 3e 65 78  th+1, pParse->ex
0cf0: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
0d00: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d10: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
0d20: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
0d30: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
0d40: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
0d60: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61  ERROR;.  }.  pPa
0d80: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  rse->nTab = 0;. 
0d90: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
0da0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  0;.  pParse->nSe
0db0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  t = 0;.  pParse-
0dc0: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61  >nVar = 0;.  pPa
0dd0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
0de0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
0df0: 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d  ookieGoto = 0;.}
0e00: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
0e10: 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20  parser and code 
0e20: 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73  generator recurs
0e30: 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ively in order t
0e40: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  o generate.** co
0e50: 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73  de for the SQL s
0e60: 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f  tatement given o
0e70: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
0e80: 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78  he pParse contex
0e90: 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  t.** currently u
0ea0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
0eb0: 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72  n.  When the par
0ec0: 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72  ser is run recur
0ed0: 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77  sively.** this w
0ee0: 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50  ay, the final OP
0ef0: 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70  _Halt is not app
0f00: 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20  ended and other 
0f10: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a  initialization.*
0f20: 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69  * and finalizati
0f30: 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69  on steps are omi
0f40: 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f  tted because tho
0f50: 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20  se are handling 
0f60: 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d  by the.** outerm
0f70: 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a  ost parser..**.*
0f80: 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67  * Not everything
0f90: 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54   is nestable.  T
0fa0: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0fb0: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d  designed to perm
0fc0: 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  it.** INSERT, UP
0fd0: 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
0fe0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69   operations agai
0ff0: 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  nst SQLITE_MASTE
1000: 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20  R.  Use.** care 
1010: 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f  if you decide to
1020: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73   try to use this
1030: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d   routine for som
1040: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73  e other purposes
1050: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1060: 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72  3NestedParse(Par
1070: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1080: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1090: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
10a0: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
10b0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 20 64  l;.  int rc;.# d
10c0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
10d0: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
10e0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
10f0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1100: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1110: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1120: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1130: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1140: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1150: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1160: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1170: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1180: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1190: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
11a0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
11b0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
11c0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
11d0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
11e0: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
11f0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1200: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1210: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1220: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1230: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1240: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1250: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1260: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1270: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
1280: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1290: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
12a0: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
12b0: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
12c0: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
12d0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
12e0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
12f0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1300: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1310: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1320: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1330: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1340: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1350: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1360: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1370: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1380: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1390: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
13a0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
13b0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
13c0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
13d0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
13e0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
13f0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
1400: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
1410: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1420: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1430: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1440: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1450: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1460: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1470: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1480: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1490: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
14a0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
14b0: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
14c0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
14d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
14e0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14f0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
1500: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
1510: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1520: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1530: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1540: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1550: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1560: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1570: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1580: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1590: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
15a0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
15b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
15c0: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
15d0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
15e0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
15f0: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
1600: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
1610: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
1620: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
1630: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1640: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
1650: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
1660: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
1670: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
1680: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61  db->aDb[j].tblHa
1690: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
16a0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
16b0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
16c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
16d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
16e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
16f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1700: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1710: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1720: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1730: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1740: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1750: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1760: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1770: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1780: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1790: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
17a0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
17b0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
17c0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
17d0: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
17e0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
17f0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1800: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
1810: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
1820: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
1830: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
1840: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1850: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
1860: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
1870: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
1880: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
1890: 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73  LocateTable(Pars
18a0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
18b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
18c0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
18d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
18e0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
18f0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1900: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1910: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1920: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1930: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1940: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1950: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1960: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1970: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1980: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1990: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
19a0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
19b0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
19c0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
19d0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
19e0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
19f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a00: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a10: 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20   table: %s.%s", 
1a20: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
1a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1a40: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
1a50: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
1a60: 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1a70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a80: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1a90: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e  \"%s\" is not in
1aa0: 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1ab0: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
1ac0: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20  e, zDbase);.    
1ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1ae0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1af0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1b00: 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ble: %s", zName)
1b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1b20: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1b30: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
1b40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
1b50: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1b60: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1b70: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
1b80: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
1b90: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
1ba0: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
1bb0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
1bc0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1bd0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1be0: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
1bf0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1c00: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1c10: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1c20: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1c30: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1c40: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
1c50: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
1c60: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
1c70: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1c80: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
1c90: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
1ca0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1cb0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
1cc0: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
1cd0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
1ce0: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
1cf0: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
1d00: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
1d10: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
1d20: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
1d30: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
1d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1d50: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1d60: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
1d70: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1d80: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1d90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
1da0: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
1db0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1dc0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
1dd0: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
1de0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
1df0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1e00: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
1e10: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1e20: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
1e30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1e40: 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  b, db->aDb[j].zN
1e50: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1e60: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1e70: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1e80: 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e  b[j].idxHash, zN
1e90: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1ea0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1ec0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1ed0: 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  ** Reclaim the m
1ee0: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e  emory used by an
1ef0: 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63   index.*/.static
1f00: 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28   void freeIndex(
1f10: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c  Index *p){.  sql
1f20: 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41  iteFree(p->zColA
1f30: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ff);.  sqliteFre
1f40: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  e(p);.}../*.** R
1f50: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
1f60: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
1f70: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
1f80: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
1f90: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
1fa0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
1fb0: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
1fc0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1fd0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74   hash tables but
1fe0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e  .** it is not un
1ff0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
2000: 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e  Table that it in
2010: 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b  dexes..** Unlink
2020: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ing from the Tab
2030: 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  le must be done 
2040: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
2050: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2060: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65  ic void sqliteDe
2070: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
2080: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  3 *db, Index *p)
2090: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
20a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
20b0: 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30  0 && p->zName!=0
20c0: 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c   );.  pOld = sql
20d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
20e0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
20f0: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
2100: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2120: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
2130: 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21   0);.  if( pOld!
2140: 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b  =0 && pOld!=p ){
2150: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2160: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2170: 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  p->iDb].idxHash,
2180: 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pOld->zName,.  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e     strlen(pOld->
21b0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
21c0: 0a 20 20 7d 0a 20 20 66 72 65 65 49 6e 64 65 78  .  }.  freeIndex
21d0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  (p);.}../*.** Fo
21e0: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
21f0: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
2200: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
2210: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
2220: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
2230: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
2240: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
2250: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
2260: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
2270: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
2280: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
2290: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
22a0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
22b0: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
22c0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
22d0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
22e0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
22f0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
2300: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
2310: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  ndex;.  int len;
2320: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
2330: 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49  (zIdxName);.  pI
2340: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61  ndex = sqlite3Ha
2350: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2360: 62 5b 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  b[iDb].idxHash, 
2370: 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c  zIdxName, len+1,
2380: 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   0);.  if( pInde
2390: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  x ){.    if( pIn
23a0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
23b0: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
23c0: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61       pIndex->pTa
23d0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  ble->pIndex = pI
23e0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
23f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
2400: 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  dex *p;.      fo
2410: 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  r(p=pIndex->pTab
2420: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  le->pIndex; p &&
2430: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
2440: 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  x; p=p->pNext){}
2450: 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20  .      if( p && 
2460: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
2470: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
2480: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
2490: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
24a0: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
24b0: 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
24c0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
24d0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
24e0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  es;.}../*.** Era
24f0: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
2500: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2510: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
2520: 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61  h tables of.** a
2530: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2540: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2550: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
2560: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
2570: 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  efore the databa
2580: 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69  se closes.  It i
2590: 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75  s also called du
25a0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ring a rollback.
25b0: 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ** if there were
25c0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
25d0: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
25e0: 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a  action or if a.*
25f0: 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  * schema-cookie 
2600: 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e  mismatch occurs.
2610: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30  .**.** If iDb<=0
2620: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
2630: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
2640: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
2650: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
2660: 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65  .  If iDb>=2 the
2670: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
2680: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
2690: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
26a0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
26b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26c0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
26d0: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
26e0: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48  b, int iDb){.  H
26f0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
2700: 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20    Hash temp1;.  
2710: 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e  Hash temp2;.  in
2720: 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72  t i, j;..  asser
2730: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
2740: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62  <db->nDb );.  db
2750: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2760: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a  TE_Initialized;.
2770: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
27a0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d  >aDb[i];.    tem
27b0: 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73  p1 = pDb->tblHas
27c0: 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70  h;.    temp2 = p
27d0: 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20  Db->trigHash;.  
27e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
27f0: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
2800: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2810: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
2820: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2830: 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20  pDb->aFKey);.   
2840: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2850: 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  r(&pDb->idxHash)
2860: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
2870: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
2880: 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20  &temp2); pElem; 
2890: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
28a0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
28b0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
28c0: 65 54 72 69 67 67 65 72 28 28 54 72 69 67 67 65  eTrigger((Trigge
28d0: 72 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  r*)sqliteHashDat
28e0: 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d  a(pElem));.    }
28f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2900: 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20  Clear(&temp2);. 
2910: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
2920: 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  it(&pDb->tblHash
2930: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2940: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f  RING, 0);.    fo
2950: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
2960: 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b  shFirst(&temp1);
2970: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
2980: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
2990: 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  em)){.      Tabl
29a0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
29b0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
29c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
29d0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
29e0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
29f0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
2a00: 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 70 44 62  &temp1);.    pDb
2a10: 2d 3e 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20  ->pSeqTab = 0;. 
2a20: 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72     DbClearProper
2a30: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68  ty(db, i, DB_Sch
2a40: 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20  emaLoaded);.    
2a50: 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75  if( iDb>0 ) retu
2a60: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
2a70: 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62  ( iDb==0 );.  db
2a80: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2a90: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2aa0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
2ab0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
2ac0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2ad0: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
2ae0: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
2af0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72  n remove then fr
2b00: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
2b10: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
2b20: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
2b30: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
2b40: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
2b50: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
2b60: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
2b70: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
2b80: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2b90: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
2ba0: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
2bb0: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
2bc0: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
2bd0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
2be0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
2bf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2c00: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2c10: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2c20: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2c30: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
2c40: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
2c50: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
2c60: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
2c70: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
2c80: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
2c90: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
2ca0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2cb0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2cc0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2cd0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2ce0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
2cf0: 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e  liteFree(pDb->zN
2d00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
2d10: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
2d20: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d30: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
2d40: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
2d50: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
2d60: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
2d70: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
2d80: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
2d90: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
2da0: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
2db0: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
2dc0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
2dd0: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
2de0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
2df0: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
2e00: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
2e10: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
2e20: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ));.    sqliteFr
2e30: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
2e40: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
2e50: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
2e60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2e70: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2e80: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
2e90: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
2ea0: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
2eb0: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
2ec0: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2ed0: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
2ee0: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
2ef0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
2f00: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
2f10: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
2f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2f30: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2f40: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
2f50: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
2f60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2f70: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
2f80: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
2f90: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
2fa0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
2fb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2fc0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
2fd0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
2fe0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2ff0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3000: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3010: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3020: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3030: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3040: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
3050: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20  mn names from a 
3060: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a  table or view..*
3070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3080: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3090: 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62  ames(Table *pTab
30a0: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
30b0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
30c0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
30d0: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
30e0: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
30f0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
3100: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
3110: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
3120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
3130: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
3140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3150: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
3160: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3170: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
3180: 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ype);.    }.    
3190: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
31a0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e->aCol);.  }.  
31b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
31c0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
31d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
31e0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
31f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
3200: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3210: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
3220: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
3230: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
3240: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
3250: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
3260: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
3270: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
3280: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
3290: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
32a0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
32b0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
32c0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72  hash table.  Nor
32d0: 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a   does it remove.
32e0: 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ** foreign keys 
32f0: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e  from the sqlite.
3300: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3310: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
3320: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
3330: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
3340: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
3350: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3360: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
3370: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
3380: 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   Indices associa
3390: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
33a0: 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20  le are unlinked 
33b0: 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a  from the "db".**
33c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
33d0: 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66  if db!=NULL.  If
33e0: 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63   db==NULL, indic
33f0: 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a  es attached to.*
3400: 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  * the table are 
3410: 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20  deleted, but it 
3420: 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20  is assumed they 
3430: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3440: 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  n.** unlinked..*
3450: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3460: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
3470: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
3480: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
3490: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
34a0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
34b0: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
34c0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
34d0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  turn;..  /* Do n
34e0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
34f0: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3500: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3510: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3520: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3530: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3540: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3550: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3560: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3570: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3580: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3590: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
35a0: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
35b0: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
35c0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
35d0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
35e0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
35f0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3600: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3610: 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  ex->iDb==pTable-
3620: 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d  >iDb || (pTable-
3630: 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65  >iDb==0 && pInde
3640: 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20  x->iDb==1) );.  
3650: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
3660: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3670: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3680: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3690: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
36a0: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
36b0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
36c0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
36d0: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
36e0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
36f0: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3700: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b  from the db->aFK
3710: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
3720: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
3730: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
3740: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
3750: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
3760: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
3770: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
3780: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44  sert( pTable->iD
3790: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
37a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37b0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
37c0: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61  b[pTable->iDb].a
37d0: 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  FKey,.          
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72   pFKey->zTo, str
3800: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
3810: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
3820: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
3830: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3840: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3850: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3860: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3870: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3880: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3890: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
38a0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
38b0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
38c0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
38d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
38e0: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3900: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3910: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3920: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
3930: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
3940: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
3950: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
3960: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
3970: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3980: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3990: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
39a0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
39b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
39c0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
39d0: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
39e0: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
39f0: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
3a00: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
3a10: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
3a20: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3a30: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
3a40: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
3a50: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
3a60: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
3a70: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
3a80: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3a90: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
3aa0: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3ab0: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29  (zTabName)+1, 0)
3ac0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
3ad0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3ae0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3af0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
3b00: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
3b10: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
3b20: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
3b30: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
3b40: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
3b50: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
3b60: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  pDb->aFKey, pF1-
3b70: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3b80: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
3b90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3ba0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3bb0: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3bc0: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3bd0: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
3be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
3bf0: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3c00: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3c10: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3c20: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3c30: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
3c40: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
3c50: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
3c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3c70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3c80: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3c90: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20  le(db, p);.  }. 
3ca0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
3cb0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3cc0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
3cd0: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
3ce0: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
3cf0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
3d00: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
3d10: 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20   token with any 
3d20: 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76  quotations remov
3d30: 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ed.  Space to ho
3d40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
3d50: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
3d60: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3d70: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
3d80: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
3d90: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
3da0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nction..**.** To
3db0: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
3dc0: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
3dd0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
3de0: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
3df0: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
3e00: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
3e10: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
3e20: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
3e30: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
3e40: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
3e50: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
3e60: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
3e70: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f  NameFromToken(To
3e80: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
3e90: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
3ea0: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
3eb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3ec0: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
3ed0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
3ee0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3ef0: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3f00: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
3f10: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
3f30: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
3f40: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
3f50: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
3f60: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
3f70: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
3f80: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
3f90: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
3fa0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
3fb0: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
3fc0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
3fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3fe0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
3ff0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
4000: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4010: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
4020: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
4030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4040: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
4050: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
4060: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
4070: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
4080: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
4090: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
40a0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
40b0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
40c0: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
40d0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
40e0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
40f0: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4100: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4110: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4120: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4130: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4140: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4150: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
4160: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4170: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
4180: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
4190: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
41a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
41b0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
41c0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
41d0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
41e0: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
41f0: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4200: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4210: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4220: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4230: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
4240: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
4250: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
4260: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
4270: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
4280: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
4290: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
42a0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e     n = strlen(zN
42b0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
42c0: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
42d0: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
42e0: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
42f0: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4300: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4310: 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28   ) && n==strlen(
4320: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
4330: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
4340: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
4350: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
4360: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4380: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4390: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
43a0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
43b0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
43c0: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
43d0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
43e0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
43f0: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4400: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4410: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4420: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4430: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4440: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4450: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
4460: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
4470: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4480: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4490: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
44a0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
44b0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
44c0: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
44d0: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
44e0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
44f0: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4500: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4510: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4520: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4540: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
4550: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
4560: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
4570: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
4580: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
4590: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
45a0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
45b0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
45c0: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
45d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
45e0: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
45f0: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4600: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4610: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4620: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4630: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4640: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
4650: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
4660: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4670: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
4680: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
4690: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
46a0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
46b0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
46c0: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
46d0: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
46e0: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
46f0: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
4700: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4720: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
4730: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
4740: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4750: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
4760: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
4770: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
4780: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
4790: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
47a0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
47b0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
47c0: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
47d0: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
47e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
47f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4800: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
4810: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
4820: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
4830: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4840: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4860: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
4870: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
4880: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
4890: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
48a0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
48b0: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
48c0: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
48d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
48e0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
48f0: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
4900: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
4910: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
4920: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
4930: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
4940: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
4950: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
4960: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
4970: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
4980: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
4990: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
49a0: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
49b0: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
49c0: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
49d0: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
49e0: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
49f0: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
4a00: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
4a10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
4a20: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
4a30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
4a40: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4a50: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4a60: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
4a70: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
4a80: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
4a90: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
4aa0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
4ab0: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
4ac0: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
4ad0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
4ae0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
4af0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4b00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4b10: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
4b20: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4b30: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
4b40: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4b50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4b60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4b70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4b80: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
4b90: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
4ba0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
4bb0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
4bc0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
4bd0: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
4be0: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
4bf0: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
4c00: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
4c10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4c20: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
4c30: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
4c40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
4c50: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
4c60: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
4c70: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
4c80: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4c90: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
4ca0: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
4cb0: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
4cc0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4cd0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
4ce0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
4cf0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
4d00: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
4d10: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
4d20: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
4d30: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
4d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
4d50: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
4d60: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
4d70: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
4d80: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
4d90: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
4da0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
4db0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
4dc0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
4dd0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
4de0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
4df0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4e00: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
4e10: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4e20: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
4e30: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
4e40: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
4e50: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
4e60: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
4e70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
4e80: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
4e90: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4ea0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4eb0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
4ec0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
4ed0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
4ee0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
4ef0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
4f00: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4f10: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
4f20: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
4f30: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
4f40: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
4f50: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4f60: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
4f70: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
4f80: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
4f90: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
4fa0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
4fb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4fc0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
4fd0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
4fe0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
4ff0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
5000: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5010: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
5020: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
5030: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
5040: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
5050: 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20  isView       /* 
5060: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
5070: 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54  a VIEW */.){.  T
5080: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
5090: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
50a0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
50b0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
50c0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
50d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
50e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
50f0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
5100: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
5110: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
5120: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
5130: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
5140: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
5150: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
5160: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
5170: 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eate */..  /* Th
5180: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5190: 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69  name to create i
51a0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
51b0: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
51c0: 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20  ens.  ** pName1 
51d0: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
51e0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
51f0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5200: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5210: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
5220: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5230: 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ...);.  ** .  **
5240: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5250: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5260: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5270: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
5280: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62   if.  ** the tab
5290: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
52a0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
52b0: 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  i.e.:.  **.  ** 
52c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
52d0: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  (...);.  **.  **
52e0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
52f0: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
5300: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20   pName2 is "".. 
5310: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
5320: 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65  l below sets the
5330: 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74   pName pointer t
5340: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5350: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5360: 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61    ** pName2) tha
5370: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
5380: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
5390: 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ame. The variabl
53a0: 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65  e iDb is.  ** se
53b0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
53c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
53d0: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72  hat the table or
53e0: 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20   view is to be. 
53f0: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a   ** created in..
5400: 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
5410: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
5420: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
5430: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
5440: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
5450: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d  eturn;.  if( !OM
5460: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5470: 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a  emp && iDb>1 ){.
5480: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
5490: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
54a0: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
54b0: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a  t be qualified *
54c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
54d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
54e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
54f0: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
5500: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
5510: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
5520: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5530: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
5540: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
5550: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
5560: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
5570: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
5580: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
5590: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
55a0: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
55b0: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
55c0: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
55d0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
55e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
55f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
5600: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
5610: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
5620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5630: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5640: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
5650: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
5660: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
5670: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
5680: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
5690: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
56a0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
56b0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
56c0: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
56d0: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
56e0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
56f0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5700: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
5710: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
5720: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
5730: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5740: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
5750: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5760: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
5770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5780: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5790: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
57a0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
57b0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
57c0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
57d0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
57e0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
57f0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
5800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5810: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5820: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
5830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5840: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5850: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
5860: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
5870: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
5880: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5890: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
58a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
58b0: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
58c0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
58d0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
58e0: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
58f0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
5900: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
5910: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
5920: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5930: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
5940: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
5950: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
5960: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
5970: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5980: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5990: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
59a0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
59b0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
59c0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
59d0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
59e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
59f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
5a00: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
5a10: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
5a20: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5a30: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5a40: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
5a50: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
5a60: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
5a70: 20 26 26 20 0a 20 20 20 20 20 20 28 20 69 44 62   && .      ( iDb
5a80: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
5a90: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71  .busy) ){.    sq
5aa0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5ab0: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
5ac0: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
5ad0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
5ae0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  e);.    goto beg
5af0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5b00: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
5b10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5b20: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
5b30: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
5b40: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
5b50: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5b60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5b70: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
5b80: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5b90: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
5ba0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
5bb0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
5bc0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
5bd0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
5be0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
5bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  ble->pIndex = 0;
5c00: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d  .  pTable->iDb =
5c10: 20 69 44 62 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   iDb;.  pTable->
5c20: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  nRef = 1;.  if( 
5c30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5c40: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
5c50: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
5c60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
5c70: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5c80: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
5c90: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
5ca0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
5cb0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
5cc0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
5cd0: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
5ce0: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
5cf0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
5d00: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5d10: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
5d20: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
5d30: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
5d40: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
5d50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5d60: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
5d70: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
5d80: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
5d90: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5da0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
5db0: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  ){.    db->aDb[i
5dc0: 44 62 5d 2e 70 53 65 71 54 61 62 20 3d 20 70 54  Db].pSeqTab = pT
5dd0: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
5de0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
5df0: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
5e00: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
5e10: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
5e20: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
5e30: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
5e40: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
5e50: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
5e60: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
5e70: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
5e80: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
5e90: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
5ea0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
5eb0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
5ec0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
5ed0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
5ee0: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
5ef0: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
5f00: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
5f10: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
5f20: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
5f30: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
5f40: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
5f50: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
5f60: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
5f70: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5f80: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
5f90: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
5fa0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
5fb0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
5fc0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5fd0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
5fe0: 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 73 71 6c  int lbl;.    sql
5ff0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6000: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
6010: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
6020: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
6030: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
6040: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
6050: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
6060: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
6070: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6080: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6090: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
60a0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
60b0: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
60c0: 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73  t */.    lbl = s
60d0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
60e0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
60f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6100: 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a  OP_If, 0, lbl);.
6110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6120: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6130: 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  er, db->file_for
6140: 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
6150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6160: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
6170: 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 1);.    sqli
6180: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6190: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
61a0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  enc, 0);.    sql
61b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
61c0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
61d0: 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 4);.    sqli
61e0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
61f0: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20  bel(v, lbl);..  
6200: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
6210: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
6220: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
6230: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6240: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
6250: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
6260: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
6270: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
6280: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
6290: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
62a0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
62b0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
62c0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
62d0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
62e0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
62f0: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6300: 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  y is left on the
6310: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
6320: 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  k..    ** The ro
6330: 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65  wid value is nee
6340: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
6350: 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  that sqlite3EndT
6360: 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  able will.    **
6370: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
6380: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6390: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69  _OMIT_VIEW.    i
63a0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
63b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
63c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
63d0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, 0, 0);.    }e
63e0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
63f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
6410: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
6420: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6430: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6440: 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  able(v, iDb);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
6470: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  d, 0, 0);.    sq
6480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6490: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
64a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
64b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
64c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
64d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
64e0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 30   OP_Insert, 0, 0
64f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6510: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
6520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6530: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
6540: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  0);.  }..  /* No
6550: 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29  rmal (non-error)
6560: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65   return. */.  re
6570: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  turn;..  /* If a
6580: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6590: 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a  we jump here */.
65a0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
65b0: 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  r:.  sqliteFree(
65c0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
65d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
65e0: 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
65f0: 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72   compare two str
6600: 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69  ings in a case-i
6610: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65  nsensitive manne
6620: 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67  r..** It is slig
6630: 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
6640: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
6650: 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74  StrICmp() direct
6660: 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75  ly, but.** produ
6670: 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e  ces larger code.
6680: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
6690: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f  This macro is no
66a0: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
66b0: 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66  h the strcmp() f
66c0: 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74  amily. It.** ret
66d0: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
66e0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65   two strings are
66f0: 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73   equal, otherwis
6700: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66  e false..*/.#def
6710: 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79  ine STRICMP(x, y
6720: 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65  ) (\.sqlite3Uppe
6730: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
6740: 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d  ned char *)(x)]=
6750: 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70  =   \.sqlite3Upp
6760: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
6770: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d  gned char *)(y)]
6780: 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65       \.&& sqlite
6790: 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28  3StrICmp((x)+1,(
67a0: 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a  y)+1)==0 )../*.*
67b0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
67c0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
67d0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
67e0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
67f0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
6800: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
6810: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
6820: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
6830: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
6840: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6850: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
6860: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
6870: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
6880: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
6890: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
68a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
68b0: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
68c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
68d0: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
68e0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
68f0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
6900: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
6910: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
6920: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
6930: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
6940: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
6950: 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
6960: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
6970: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
6980: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
6990: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
69a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
69b0: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
69c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
69d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
69e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
69f0: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
6a00: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
6a10: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6a20: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
6a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
6a40: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
6a50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
6a60: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
6a70: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
6a80: 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d  oc( p->aCol, (p-
6a90: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
6aa0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6ab0: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
6ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6ad0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
6ae0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
6af0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
6b00: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
6b10: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
6b20: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
6b30: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
6b40: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
6b50: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
6b60: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
6b70: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
6b80: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
6b90: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
6ba0: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
6bb0: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
6bc0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
6bd0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
6be0: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
6bf0: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
6c00: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
6c10: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
6c20: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
6c30: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
6c40: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c  AFF_NONE;.  pCol
6c50: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ->pColl = pParse
6c60: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
6c70: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
6c80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6c90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
6ca0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
6cb0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
6cc0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
6cd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6ce0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
6cf0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
6d00: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
6d10: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
6d20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
6d30: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
6d40: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
6d50: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
6d60: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
6d70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6d80: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
6d90: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
6da0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
6db0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
6dc0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6dd0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6de0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
6df0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
6e00: 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69  i>=0 ) p->aCol[i
6e10: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  ].notNull = onEr
6e20: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
6e30: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
6e40: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
6e50: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
6e60: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
6e70: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
6e80: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
6e90: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
6ea0: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
6eb0: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
6ec0: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
6ed0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
6ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
6ef0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
6f00: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
6f10: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
6f20: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
6f30: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
6f40: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
6f50: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
6f60: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
6f70: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
6f80: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
6f90: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
6fa0: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
6fb0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
6fc0: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
6fd0: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
6fe0: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
6ff0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
7000: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
7010: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
7040: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
7050: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
7060: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
7070: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7080: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
7090: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
70a0: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
70b0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
70c0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
70d0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
70e0: 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 0a 2a 2a  E_AFF_NONE.**.**
70f0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
7100: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7110: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
7120: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
7130: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
7140: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
7150: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
7160: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f  ityType(const To
7170: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75  ken *pType){.  u
7180: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
7190: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
71a0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
71b0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
71c0: 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a   *zIn = pType->z
71d0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
71e0: 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20  ed char *zEnd = 
71f0: 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d  &pType->z[pType-
7200: 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a  >n];..  while( z
7210: 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20  In!=zEnd ){.    
7220: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
7230: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7240: 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b  [*zIn];.    zIn+
7250: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
7260: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
7270: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
7280: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
7290: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
72a0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
72b0: 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c  F_TEXT; .    }el
72c0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
72d0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
72e0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
72f0: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
7300: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7310: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
7320: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7330: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
7340: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
7350: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
7360: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
7370: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7380: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
7390: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
73a0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
73b0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
73c0: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
73d0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
73e0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
73f0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7400: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
7410: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
7420: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
7430: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
7440: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
7450: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7460: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7470: 47 45 52 3b 20 0a 20 20 20 20 20 20 62 72 65 61  GER; .      brea
7480: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
7490: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
74a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
74b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
74c0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
74d0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
74e0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
74f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
7500: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
7510: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
7520: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
7530: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
7540: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
7550: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
7560: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
7570: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
7580: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
7590: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
75a0: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
75b0: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
75c0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
75d0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
75e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
75f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
7600: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
7610: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
7620: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
7630: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
7640: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
7650: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
7660: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
7670: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7680: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
7690: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28   *pCol;..  if( (
76a0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
76b0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
76c0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
76d0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
76e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
76f0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
7700: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a   assert( pCol->z
7710: 54 79 70 65 3d 3d 30 20 29 3b 0a 23 69 66 20 30  Type==0 );.#if 0
7720: 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  .  z = pCol->zTy
7730: 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  pe = sqliteMallo
7740: 63 52 61 77 28 6e 2b 31 29 3b 0a 20 20 69 66 28  cRaw(n+1);.  if(
7750: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7760: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
7770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
7780: 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20 20 20  c = zIn[i];.    
7790: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
77a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
77b0: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  [j++] = c;.  }. 
77c0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 23 65 6e 64 69   z[j] = 0;.#endi
77d0: 66 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  f.  pCol->zType 
77e0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
77f0: 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20  mToken(pType);. 
7800: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7810: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
7820: 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a  yType(pType);.}.
7830: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
7840: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
7850: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
7860: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7870: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
7880: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
7890: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
78a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
78b0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
78c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
78d0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
78e0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
78f0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
7900: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
7910: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7920: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7930: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7940: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7950: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7960: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7970: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
7980: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
7990: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
79a0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
79b0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
79c0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
79d0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
79e0: 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b  pNewTable)!=0 ){
79f0: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
7a00: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
7a10: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
7a20: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
7a30: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
7a40: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
7a50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7a60: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
7a70: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
7a80: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
7a90: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
7aa0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
7ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7ac0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
7ad0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
7ae0: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
7af0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7b00: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
7b10: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
7b20: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a  elete(pExpr);.}.
7b30: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
7b40: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
7b50: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
7b60: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
7b70: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
7b80: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
7b90: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
7ba0: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
7bb0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
7bc0: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
7bd0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
7be0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
7bf0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
7c00: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
7c10: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
7c20: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
7c30: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
7c40: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
7c50: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
7c60: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
7c70: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
7c80: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
7c90: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
7ca0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
7cb0: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
7cc0: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
7cd0: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
7ce0: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
7cf0: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
7d00: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
7d10: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
7d20: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
7d30: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
7d40: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
7d50: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
7d60: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
7d70: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7d80: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
7d90: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
7da0: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
7db0: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
7dc0: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
7dd0: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
7de0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
7df0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
7e00: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
7e10: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
7e20: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
7e30: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
7e40: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7e50: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
7e60: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
7e70: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
7e80: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
7e90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7ea0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
7eb0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
7ec0: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
7ed0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
7ee0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
7ef0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
7f00: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
7f10: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
7f20: 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20 2f 2a  autoInc       /*
7f30: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
7f40: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
7f50: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
7f60: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
7f70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
7f80: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
7f90: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
7fa0: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
7fb0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
7fc0: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
7fd0: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
7fe0: 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  >hasPrimKey ){. 
7ff0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8000: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8010: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
8020: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
8030: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
8040: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
8050: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
8060: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
8070: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
8080: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
8090: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
80a0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
80b0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
80c0: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
80d0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
80e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
80f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8100: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
8110: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
8120: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
8130: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8140: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
8150: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
8160: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8170: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8190: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
81a0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
81b0: 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61  ->nCol ) pTab->a
81c0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
81d0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Key = 1;.    }. 
81e0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45     if( pList->nE
81f0: 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d  xpr>1 ) iCol = -
8200: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  1;.  }.  if( iCo
8210: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8220: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  b->nCol ){.    z
8230: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
8240: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
8250: 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26   }.  if( zType &
8260: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
8270: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
8280: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61  ")==0 ){.    pTa
8290: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
82a0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
82b0: 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  nf = onError;.  
82c0: 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20    pTab->autoInc 
82d0: 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c  = autoInc;.  }el
82e0: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
82f0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8300: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
8310: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
8320: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8330: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
8340: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
8350: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
8360: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8370: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
8380: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
8390: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
83a0: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
83b0: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
83c0: 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   0);.    pList =
83d0: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
83e0: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
83f0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8400: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
8410: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  urn;.}../*.** Se
8420: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
8430: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
8440: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
8450: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
8460: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
8470: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
8480: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
8490: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
84a0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
84b0: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
84c0: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
84d0: 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  p;.  Index *pIdx
84e0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
84f0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
8500: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
8510: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
8520: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
8530: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f  ->nCol-1;..  pCo
8540: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
8550: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
8560: 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b  , zType, nType);
8570: 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43  .  p->aCol[i].pC
8580: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20  oll = pColl;..  
8590: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
85a0: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
85b0: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
85c0: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
85d0: 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61  e>",.  ** then a
85e0: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
85f0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
8600: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
8610: 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c  ore the.  ** col
8620: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
8630: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
8640: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
8650: 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   case..  */.  fo
8660: 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64  r(pIdx = p->pInd
8670: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
8680: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
8690: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
86a0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
86b0: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
86c0: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78  umn[0]==i ) pIdx
86d0: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
86e0: 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a  0] = pColl;.  }.
86f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
8700: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
8710: 71 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c  q() for all coll
8720: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
8730: 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20  in an index,.** 
8740: 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69  in order to veri
8750: 66 79 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  fy that all the 
8760: 6e 65 63 65 73 73 61 72 79 20 63 6f 6c 6c 61 74  necessary collat
8770: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72  ing sequences ar
8780: 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a  e.** loaded..*/.
8790: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
87a0: 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72  IndexCollSeq(Par
87b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
87c0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20  x *pIdx){.  if( 
87d0: 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  pIdx ){.    int 
87e0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
87f0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
8800: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
8810: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
8820: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64  lSeq(pParse, pId
8830: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
8840: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
8850: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8860: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
8870: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8880: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8890: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
88a0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
88b0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
88c0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
88d0: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
88e0: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
88f0: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
8900: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
8910: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
8920: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
8930: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
8940: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
8950: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
8960: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
8970: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
8980: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
8990: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
89a0: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
89b0: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
89c0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
89d0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
89e0: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
89f0: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
8a00: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
8a10: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
8a20: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
8a30: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
8a40: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
8a50: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
8a60: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
8a70: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
8a80: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
8a90: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
8aa0: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
8ab0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
8ac0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
8ad0: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
8ae0: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
8af0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
8b00: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
8b10: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
8b20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
8b30: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
8b40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8b50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
8b60: 38 20 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b  8 enc = db->enc;
8b70: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
8b80: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
8b90: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
8ba0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
8bb0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
8bc0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e  zName, nName, in
8bd0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
8be0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
8bf0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
8c00: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
8c10: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
8c20: 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c  llSeq(db, pColl,
8c30: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
8c40: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
8c50: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  {.      if( nNam
8c60: 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  e<0 ){.        n
8c70: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
8c80: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
8c90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8ca0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
8cb0: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
8cc0: 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20  equence: %.*s", 
8cd0: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  nName, zName);. 
8ce0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a       pColl = 0;.
8cf0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8d00: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
8d10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
8d20: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
8d30: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
8d40: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
8d50: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
8d60: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
8d70: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
8d80: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
8d90: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
8da0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
8db0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
8dc0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
8dd0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
8de0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
8df0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
8e00: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
8e10: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
8e20: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
8e30: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
8e40: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
8e50: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
8e60: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
8e70: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
8e80: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
8e90: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
8ea0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
8eb0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
8ec0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
8ed0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
8ee0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
8ef0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
8f00: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
8f10: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
8f20: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
8f30: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
8f40: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
8f50: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
8f60: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
8f70: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
8f80: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
8f90: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
8fa0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
8fb0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
8fc0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
8fd0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
8fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
8ff0: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  geCookie(sqlite3
9000: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69   *db, Vdbe *v, i
9010: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
9020: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9030: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
9040: 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
9050: 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73  ookie+1, 0);.  s
9060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9070: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
9080: 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a   iDb, 0);.}../*.
9090: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
90a0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
90b0: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
90c0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
90d0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
90e0: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
90f0: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
9100: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
9110: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
9120: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
9130: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
9140: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
9150: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
9160: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
9170: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
9180: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
9190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
91a0: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
91b0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
91c0: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
91d0: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
91e0: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
91f0: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
9200: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
9210: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
9220: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
9230: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
9240: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
9250: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
9260: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
9270: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
9280: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
9290: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
92a0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
92b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
92c0: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
92d0: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
92e0: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
92f0: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
9300: 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72  i = *pIdx;.  for
9310: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
9320: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
9330: 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  isalnum(zIdent[j
9340: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
9350: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
9360: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
9370: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c   zIdent[j]!=0 ||
9380: 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b   isdigit(zIdent[
9390: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
93a0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
93b0: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
93c0: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
93d0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
93e0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
93f0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
9400: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
9410: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
9420: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
9430: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
9440: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
9450: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
9460: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
9470: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
9480: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
9490: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
94a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
94b0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
94c0: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
94d0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
94e0: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
94f0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
9500: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
9510: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
9520: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
9530: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
9540: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
9550: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
9560: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
9570: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
9580: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
9590: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
95a0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
95b0: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
95c0: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
95d0: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
95e0: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
95f0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
9600: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
9610: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
9620: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
9630: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
9640: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
9650: 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20  n += (strlen(z) 
9660: 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  + 1);.    }.  }.
9670: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
9680: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
9690: 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20  if( n<50 ){.    
96a0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
96b0: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
96c0: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
96d0: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
96e0: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
96f0: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
9700: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
9710: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
9720: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
9730: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
9740: 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  Raw( n );.  if( 
9750: 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  zStmt==0 ) retur
9760: 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53  n 0;.  strcpy(zS
9770: 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44  tmt, !OMIT_TEMPD
9780: 42 26 26 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22  B&&p->iDb==1 ? "
9790: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
97a0: 45 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c  E ":"CREATE TABL
97b0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
97c0: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
97d0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
97e0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
97f0: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
9800: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
9810: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
9820: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
9830: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
9840: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
9850: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
9860: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
9870: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
9880: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
9890: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
98a0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20  );.    if( (z = 
98b0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20  pCol->zType)!=0 
98c0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b  ){.      zStmt[k
98d0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
98e0: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
98f0: 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b  ], z);.      k +
9900: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
9910: 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28   }.  }.  strcpy(
9920: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29  &zStmt[k], zEnd)
9930: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
9940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9950: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9960: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
9970: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
9980: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
9990: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
99a0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
99b0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
99c0: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
99d0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
99e0: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
99f0: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
9a00: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
9a10: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
9a20: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
9a30: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
9a40: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
9a50: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
9a60: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
9a70: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
9a80: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
9a90: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
9aa0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
9ab0: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
9ac0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
9ad0: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
9ae0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
9af0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
9b00: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
9b10: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
9b20: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
9b30: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
9b40: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
9b50: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
9b60: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
9b70: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
9b80: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
9b90: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
9ba0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9bb0: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
9bc0: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
9bd0: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
9be0: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
9bf0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
9c00: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
9c10: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
9c20: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
9c30: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
9c40: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
9c50: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
9c60: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
9c70: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
9c80: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
9c90: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
9ca0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
9cb0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9cc0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
9cd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
9ce0: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
9cf0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9d00: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
9d10: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
9d20: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
9d30: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
9d40: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
9d50: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
9d60: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
9d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9d80: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
9d90: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
9da0: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
9db0: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
9dc0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
9dd0: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
9de0: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
9df0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
9e00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9e10: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28  se->db;..  if( (
9e20: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
9e30: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
9e40: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
9e50: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
9e60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
9e70: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9e80: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
9e90: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
9ea0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
9eb0: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
9ec0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
9ed0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
9ee0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
9ef0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
9f00: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
9f10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
9f20: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
9f30: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
9f40: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
9f50: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
9f60: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
9f70: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
9f80: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
9f90: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
9fa0: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
9fb0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
9fc0: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
9fd0: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
9fe0: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
9ff0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
a000: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
a010: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
a020: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
a030: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
a040: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
a050: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
a060: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
a070: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
a080: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
a090: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
a0a0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
a0b0: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
a0c0: 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72  base.  The recor
a0d0: 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  d number.  ** fo
a0e0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
a0f0: 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72  entry should alr
a100: 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73  eady be on the s
a110: 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
a120: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
a130: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
a140: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
a150: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
a160: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
a170: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
a180: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
a190: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
a1a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
a1b0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
a1c0: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
a1d0: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
a1e0: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
a1f0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
a200: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
a210: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
a220: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
a230: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
a240: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
a250: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
a260: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
a270: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
a280: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
a290: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
a2a0: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
a2b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a2c0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
a2d0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
a2e0: 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
a2f0: 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20  e new table and 
a300: 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65  push it onto the
a310: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41   stack..    ** A
a320: 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f   view has no roo
a330: 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70  tpage, so just p
a340: 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20  ush a zero onto 
a350: 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20  the stack for.  
a360: 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69    ** views.  Ini
a370: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74  tialize zType at
a380: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
a390: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
a3a0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
a3b0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
a3c0: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
a3d0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
a3e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
a3f0: 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c  teTable, p->iDb,
a400: 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 54   0); */.      zT
a410: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
a420: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
a430: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
a440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
a450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a460: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
a470: 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 56 64 62    /*  sqlite3Vdb
a480: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
a490: 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a  eger, 0, 0); */.
a4a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
a4b0: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
a4c0: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
a4d0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
a4e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
a4f0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
a500: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
a510: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
a520: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
a530: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
a540: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
a550: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
a560: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
a570: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e   new table is on
a580: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
a590: 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20  vdbe stack..    
a5a0: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
a5b0: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
a5c0: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
a5d0: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
a5e0: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
a5f0: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
a600: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
a610: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
a620: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
a630: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
a640: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  ew table..    */
a650: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
a660: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
a670: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20  *pSelTab;.      
a680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a690: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
a6a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a6b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a6c0: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c  Integer, p->iDb,
a6d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a6e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a6f0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
a700: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
a710: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
a720: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
a730: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
a740: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
a750: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
a760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a770: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
a780: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
a790: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
a7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
a7b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
a7c0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
a7d0: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
a7e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
a7f0: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
a800: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
a810: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
a820: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
a830: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
a840: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
a850: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
a860: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
a870: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
a880: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
a890: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
a8a0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
a8b0: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
a8c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a8d0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
a8e0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
a8f0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
a900: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a910: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
a920: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
a930: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70  reateTableStmt(p
a940: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a950: 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20      n = pEnd->z 
a960: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
a970: 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20  oken.z + 1;.    
a980: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
a990: 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45  3MPrintf("CREATE
a9a0: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
a9b0: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
a9c0: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
a9d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
a9e0: 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
a9f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
aa00: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
aa10: 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
aa20: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
aa30: 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
aa40: 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
aa50: 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
aa60: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
aa70: 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
aa80: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f  d.  The rowid fo
aa90: 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74  r the preallocat
aaa0: 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  ed.    ** slot i
aab0: 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f  s the 2nd item o
aac0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  n the stack.  Th
aad0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
aae0: 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ck is the.    **
aaf0: 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74   root page for t
ab00: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72  he new table (or
ab10: 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20   a 0 if this is 
ab20: 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a  a view)..    */.
ab30: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
ab40: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
ab50: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
ab60: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
ab70: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
ab80: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
ab90: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c  %Q, rootpage=#0,
aba0: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
abb0: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31   "WHERE rowid=#1
abc0: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
abd0: 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  [p->iDb].zName, 
abe0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e  SCHEMA_TABLE(p->
abf0: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
ac00: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
ac10: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
ac20: 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  e,.      zStmt. 
ac30: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
ac40: 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20  Free(zStmt);.   
ac50: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
ac60: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69  okie(db, v, p->i
ac70: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
ac80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
ac90: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
aca0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
acb0: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
acc0: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
acd0: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
ace0: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
acf0: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
ad00: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
ad10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f  .    if( p->auto
ad20: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20  Inc ){.      Db 
ad30: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
ad40: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20 69  p->iDb];.      i
ad50: 66 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62 3d  f( pDb->pSeqTab=
ad60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
ad70: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
ad80: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
ad90: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
ada0: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
adb0: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
adc0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
add0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
ade0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
adf0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
ae00: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
ae10: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
ae20: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
ae30: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
ae40: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
ae50: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
ae60: 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  p->iDb, 0,.     
ae70: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
ae80: 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  f("tbl_name='%q'
ae90: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  ",p->zName), P3_
aea0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a  DYNAMIC);.  }...
aeb0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
aec0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
aed0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
aee0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
aef0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
af00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
af10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
af20: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
af30: 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  ld;.    FKey *pF
af40: 4b 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44  Key; .    Db *pD
af50: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  b = &db->aDb[p->
af60: 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  iDb];.    pOld =
af70: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
af80: 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  rt(&pDb->tblHash
af90: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
afa0: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
afb0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
afc0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
afd0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
afe0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
aff0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
b000: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
b010: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b020: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b030: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
b040: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65  KEY.    for(pFKe
b050: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
b060: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
b070: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
b080: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
b090: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
b0a0: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
b0b0: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
b0c0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d  e3HashFind(&pDb-
b0d0: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
b0e0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
b0f0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
b100: 74 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70  t(&pDb->aFKey, p
b110: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
b120: 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65  pFKey);.    }.#e
b130: 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d  ndif.    pParse-
b140: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
b150: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
b160: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
b170: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
b180: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
b190: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
b1a0: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
b1b0: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
b1c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
b1d0: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
b1e0: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
b1f0: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
b200: 20 29 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b   ) pCons = pEnd;
b210: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
b220: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 28 70  Offset = 13 + (p
b230: 43 6f 6e 73 2d 3e 7a 20 2d 20 70 50 61 72 73 65  Cons->z - pParse
b240: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
b250: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b260: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
b270: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
b280: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
b290: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
b2a0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
b2b0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
b2c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
b2d0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
b2e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b2f0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
b300: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
b310: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
b320: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
b330: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
b340: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
b350: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
b360: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
b370: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
b380: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
b390: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
b3a0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
b3b0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
b3c0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b3d0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
b3e0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
b3f0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
b400: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
b410: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
b420: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
b430: 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp         /* TR
b440: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
b450: 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20  RY view */.){.  
b460: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
b470: 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  n;.  const unsig
b480: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  ned char *z;.  T
b490: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
b4a0: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
b4b0: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 69 66  en *pName;..  if
b4c0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
b4d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b4e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b4f0: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
b500: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
b510: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
b520: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
b530: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
b540: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
b550: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
b560: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
b570: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
b580: 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20  Temp, 1);.  p = 
b590: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b5a0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
b5b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
b5c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b5d0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b5e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b5f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
b600: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
b610: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
b620: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  &pName);.  if( s
b630: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
b640: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
b650: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
b660: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
b670: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
b680: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
b690: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b6a0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b6b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b6c0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
b6d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
b6e0: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
b6f0: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
b700: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
b710: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
b720: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
b730: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
b740: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
b750: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
b760: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
b770: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
b780: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
b790: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
b7a0: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
b7b0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
b7c0: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
b7d0: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
b7e0: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
b7f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b800: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
b810: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
b820: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
b830: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
b840: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
b850: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
b860: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
b870: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
b880: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
b890: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
b8a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
b8b0: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
b8c0: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
b8d0: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
b8e0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
b8f0: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
b900: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
b910: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
b920: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
b930: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
b940: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
b950: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
b960: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
b970: 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b  char*)pBegin->z;
b980: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
b990: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
b9a0: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
b9b0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
b9c0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
b9d0: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
b9e0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
b9f0: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
ba00: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
ba10: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
ba20: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
ba30: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
ba40: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
ba50: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
ba60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ba70: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64  T_VIEW */..#ifnd
ba80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
ba90: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  IEW./*.** The Ta
baa0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
bab0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
bac0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
bad0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
bae0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
baf0: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
bb00: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
bb10: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
bb20: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
bb30: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
bb40: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
bb50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
bb60: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
bb70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bb80: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
bb90: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
bba0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
bbb0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
bbc0: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
bbd0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
bbe0: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
bbf0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
bc00: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
bc10: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
bc20: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
bc30: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
bc40: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
bc50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bc60: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
bc70: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
bc80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
bc90: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
bca0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
bcb0: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
bcc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  /..  assert( pTa
bcd0: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
bce0: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
bcf0: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
bd00: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
bd10: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
bd20: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
bd30: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
bd40: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
bd50: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
bd60: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
bd70: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
bd80: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
bd90: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
bda0: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
bdb0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
bdc0: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
bdd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
bde0: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
bdf0: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
be00: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
be10: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
be20: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
be30: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
be40: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
be50: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
be60: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
be70: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
be80: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
be90: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
bea0: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
beb0: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
bec0: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
bed0: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
bee0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
bef0: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
bf00: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
bf10: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
bf20: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
bf30: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
bf40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bf50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
bf60: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
bf70: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
bf80: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
bf90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
bfa0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
bfb0: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
bfc0: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
bfd0: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
bfe0: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
bff0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
c000: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
c010: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
c020: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
c030: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
c040: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
c050: 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
c060: 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
c070: 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
c080: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
c090: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
c0a0: 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
c0b0: 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
c0c0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
c0d0: 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
c0e0: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
c0f0: 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
c100: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
c110: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
c120: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
c130: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c140: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
c150: 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
c160: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61  te3SelectDup(pTa
c170: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
c180: 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
c190: 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  b;.  sqlite3SrcL
c1a0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
c1b0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
c1c0: 53 72 63 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Src);.  pTable->
c1d0: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65  nCol = -1;.  pSe
c1e0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
c1f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
c200: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29  pParse, 0, pSel)
c210: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
c220: 20 3d 20 6e 3b 0a 20 20 69 66 28 20 70 53 65 6c   = n;.  if( pSel
c230: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
c240: 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
c250: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  =0 );.    pTable
c260: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
c270: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  ->nCol;.    pTab
c280: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
c290: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
c2a0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
c2b0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
c2c0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
c2d0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
c2e0: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
c2f0: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70 50  DbSetProperty(pP
c300: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65  arse->db, pTable
c310: 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65  ->iDb, DB_Unrese
c320: 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65  tViews);.  }else
c330: 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  {.    pTable->nC
c340: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72  ol = 0;.    nErr
c350: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
c360: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
c370: 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45  el);.  return nE
c380: 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
c390: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c3a0: 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EW */..#ifndef S
c3b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c3c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
c3d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
c3e0: 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
c3f0: 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
c400: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
c410: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
c420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
c430: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
c440: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
c450: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
c460: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
c470: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
c480: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
c490: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
c4a0: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
c4b0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
c4c0: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
c4d0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c4e0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
c4f0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
c500: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
c510: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
c520: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
c530: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
c540: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
c550: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
c560: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
c570: 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
c580: 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
c590: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c5a0: 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
c5b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c5c0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
c5d0: 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
c5e0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
c5f0: 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
c600: 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
c610: 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
c620: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
c630: 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
c640: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
c650: 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
c660: 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
c670: 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
c680: 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64  to iTo..*/.#ifnd
c690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c6a0: 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
c6b0: 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
c6c0: 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74  ved(Db *pDb, int
c6d0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
c6e0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
c6f0: 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45  lem;.  .  for(pE
c700: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
c710: 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73  rst(&pDb->tblHas
c720: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
c730: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
c740: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
c750: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
c760: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
c770: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
c780: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
c790: 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
c7a0: 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74  = iTo;.      ret
c7b0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
c7c0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
c7d0: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
c7e0: 3e 69 64 78 48 61 73 68 29 3b 20 70 45 6c 65 6d  >idxHash); pElem
c7f0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
c800: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
c810: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
c820: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c830: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
c840: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
c850: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
c860: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
c870: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c880: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 30  }.  }.  assert(0
c890: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
c8a0: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
c8b0: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
c8c0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
c8d0: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
c8e0: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
c8f0: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
c900: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
c910: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
c920: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
c930: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
c940: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
c950: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
c960: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
c970: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
c980: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
c990: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
c9a0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
c9b0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
c9c0: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
c9d0: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
c9e0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
c9f0: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
ca00: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
ca10: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
ca20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
ca30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
ca40: 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44  troy, iTable, iD
ca50: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
ca60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ca70: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
ca80: 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74  oy pushes an int
ca90: 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74  eger onto the st
caa0: 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74  ack. If this int
cab0: 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e  eger.  ** is non
cac0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
cad0: 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
cae0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c  number of a tabl
caf0: 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  e moved to.  ** 
cb00: 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e  location iTable.
cb10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
cb20: 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ode modifies the
cb30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
cb40: 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
cb50: 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
cb60: 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e    ** The "#0" in
cb70: 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
cb80: 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
cb90: 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
cba0: 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
cbb0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
cbc0: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73  he stack.  See s
cbd0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
cbe0: 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  pr()..  */.  sql
cbf0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
cc00: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
cc10: 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
cc20: 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
cc30: 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67  E #0 AND rootpag
cc40: 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72  e=#0",.     pPar
cc50: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
cc60: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
cc70: 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
cc80: 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  e);.#endif.}../*
cc90: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
cca0: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
ccb0: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
ccc0: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
ccd0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
cce0: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
ccf0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
cd00: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
cd10: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
cd20: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
cd30: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
cd40: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
cd50: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
cd60: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
cd70: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
cd80: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
cd90: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
cda0: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
cdb0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
cdc0: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
cdd0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
cde0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
cdf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
ce00: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
ce10: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 64 65  ndex *pIdx;.  de
ce20: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
ce30: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
ce40: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
ce50: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
ce60: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
ce70: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
ce80: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
ce90: 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
cea0: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44  ->tnum, pIdx->iD
ceb0: 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
cec0: 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
ced0: 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
cee0: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
cef0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
cf00: 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
cf10: 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
cf20: 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
cf30: 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
cf40: 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
cf50: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
cf60: 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
cf70: 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
cf80: 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
cf90: 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
cfa0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
cfb0: 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
cfc0: 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
cfd0: 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
cfe0: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
cff0: 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
d000: 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
d010: 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
d020: 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
d030: 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
d040: 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
d050: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
d060: 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
d070: 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
d080: 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
d090: 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
d0a0: 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
d0b0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
d0c0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
d0d0: 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
d0e0: 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
d0f0: 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
d100: 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
d110: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
d120: 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
d130: 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
d140: 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
d150: 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
d160: 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
d170: 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
d180: 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
d190: 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
d1a0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
d1b0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
d1c0: 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
d1d0: 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
d1e0: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
d1f0: 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
d200: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
d210: 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
d220: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d230: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d240: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d250: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
d260: 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
d270: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
d280: 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20  >iDb==pTab->iDb 
d290: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
d2a0: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
d2b0: 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
d2c0: 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
d2d0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
d2e0: 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
d2f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d300: 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
d310: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
d320: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
d330: 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
d340: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
d350: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c   iDestroyed = iL
d360: 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64  argest;.  }.#end
d370: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
d380: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d390: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
d3a0: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
d3b0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
d3c0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
d3d0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
d3e0: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
d3f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
d400: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
d410: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
d420: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
d430: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
d440: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
d450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d460: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
d470: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
d480: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
d490: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
d4a0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
d4b0: 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72  p_table;.  asser
d4c0: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
d4d0: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
d4e0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
d4f0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
d500: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
d510: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
d520: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
d530: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  =0 ) goto exit_d
d540: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62  rop_table;.  iDb
d550: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
d560: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
d570: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
d580: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d590: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
d5a0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
d5b0: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
d5c0: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
d5d0: 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69  MA_TABLE(pTab->i
d5e0: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
d5f0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
d600: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
d610: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
d620: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
d630: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
d640: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
d650: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
d660: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
d670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d680: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
d690: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
d6a0: 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
d6b0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
d6c0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
d6d0: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
d6e0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
d6f0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
d700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d710: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
d720: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
d730: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
d740: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
d750: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
d760: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d770: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
d780: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
d790: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d7a0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
d7b0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
d7c0: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
d7d0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
d7e0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
d7f0: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
d800: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
d810: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
d820: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
d830: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
d840: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
d850: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
d860: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
d870: 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  f.  if( pTab->re
d880: 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d  adOnly || pTab==
d890: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65  db->aDb[iDb].pSe
d8a0: 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  qTab ){.    sqli
d8b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d8c0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
d8d0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
d8e0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
d8f0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
d900: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
d910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d920: 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
d930: 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
d940: 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
d950: 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
d960: 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
d970: 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
d980: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
d990: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
d9a0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
d9b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d9c0: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
d9d0: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
d9e0: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
d9f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
da00: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
da10: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
da20: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
da30: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
da40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
da50: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
da60: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
da70: 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
da80: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
da90: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
daa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
dab0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
dac0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
dad0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
dae0: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
daf0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
db00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
db10: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
db20: 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   v ){.    Trigge
db30: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
db40: 20 69 6e 74 20 69 44 62 20 3d 20 70 54 61 62 2d   int iDb = pTab-
db50: 3e 69 44 62 3b 0a 20 20 20 20 44 62 20 2a 70 44  >iDb;.    Db *pD
db60: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
db70: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ];.    sqlite3Be
db80: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
db90: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
dba0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
dbb0: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
dbc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
dbd0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
dbe0: 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a  pped. Code.    *
dbf0: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
dc00: 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
dc10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
dc20: 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a  ter and/or.    *
dc30: 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
dc40: 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
dc50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72  ..    */.    pTr
dc60: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
dc70: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
dc80: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
dc90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
dca0: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 69 44 62 20  igger->iDb==iDb 
dcb0: 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62  || pTrigger->iDb
dcc0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
dcd0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
dce0: 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
dcf0: 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ger, 1);.      p
dd00: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
dd10: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
dd20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
dd30: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
dd40: 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  ENT.    /* Remov
dd50: 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
dd60: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
dd70: 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
dd80: 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
dd90: 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
dda0: 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
ddb0: 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
ddc0: 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
ddd0: 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68  ped.    ** at th
dde0: 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
ddf0: 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
de00: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
de10: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
de20: 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
de30: 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
de40: 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
de50: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
de60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
de70: 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  Tab->autoInc ){.
de80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
de90: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
dea0: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
deb0: 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f   FROM %s.sqlite_
dec0: 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e  sequence WHERE n
ded0: 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
dee0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
def0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  b->zName.      )
df00: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
df10: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
df20: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
df30: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
df40: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
df50: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   to the.    ** t
df60: 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
df70: 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
df80: 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
df90: 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
dfa0: 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  s.    ** every r
dfb0: 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
dfc0: 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
dfd0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
dfe0: 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20  e one being.    
dff0: 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
e000: 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
e010: 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61   seperately beca
e020: 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
e030: 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  n be.    ** crea
e040: 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
e050: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
e060: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
e070: 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  in another.    *
e080: 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
e090: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
e0a0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
e0b0: 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  , .        "DELE
e0c0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
e0d0: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
e0e0: 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
e0f0: 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44  er'",.        pD
e100: 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
e110: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
e120: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b->zName);.    i
e130: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
e140: 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
e150: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
e160: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
e170: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
e180: 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
e190: 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
e1a0: 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
e1b0: 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
e1c0: 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20  cookie..    */. 
e1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
e1e0: 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  3(v, OP_DropTabl
e1f0: 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d  e, iDb, 0, pTab-
e200: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
e210: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
e220: 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
e230: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65  .  }.  sqliteVie
e240: 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
e250: 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74  b);..exit_drop_t
e260: 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
e270: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
e280: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
e290: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e2a0: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
e2b0: 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
e2c0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
e2d0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
e2e0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
e2f0: 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
e300: 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
e310: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
e320: 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
e330: 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
e340: 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
e350: 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
e360: 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
e370: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
e380: 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
e390: 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
e3a0: 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
e3b0: 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
e3c0: 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
e3d0: 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
e3e0: 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
e3f0: 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
e400: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
e410: 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
e420: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
e430: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
e440: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
e450: 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
e460: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
e470: 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
e480: 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
e490: 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
e4a0: 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
e4b0: 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
e4c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
e4d0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
e4e0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
e4f0: 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
e500: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
e510: 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79  d.  The new FKey
e520: 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65  .** is not linke
e530: 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79  d into db->aFKey
e540: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d   at this point -
e550: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68   that does not h
e560: 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73  appen.** until s
e570: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
e580: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
e590: 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
e5a0: 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
e5b0: 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
e5c0: 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
e5d0: 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
e5e0: 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
e5f0: 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
e600: 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
e610: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
e620: 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
e630: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e640: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e650: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
e660: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
e670: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
e680: 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
e690: 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
e6a0: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
e6b0: 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
e6c0: 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
e6d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
e6e0: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
e6f0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
e700: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
e710: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
e730: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
e740: 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
e750: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
e760: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
e770: 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
e780: 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20  = 0;.  Table *p 
e790: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
e7a0: 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
e7b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
e7c0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
e7d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
e7e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
e7f0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
e800: 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  r ) goto fk_end;
e810: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
e820: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
e830: 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
e840: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e850: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
e860: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
e870: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
e880: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e890: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e8a0: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
e8b0: 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
e8c0: 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
e8d0: 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
e8e0: 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
e8f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
e900: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
e910: 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
e920: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
e930: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
e940: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
e950: 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
e960: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
e970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e980: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
e990: 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
e9a0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
e9b0: 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
e9c0: 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
e9d0: 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
e9e0: 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
e9f0: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
ea00: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
ea10: 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
ea20: 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
ea30: 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
ea40: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
ea50: 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
ea60: 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
ea70: 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
ea80: 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
ea90: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
eaa0: 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
eab0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
eac0: 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f  te += strlen(pTo
ead0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
eae0: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
eaf0: 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
eb00: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
eb10: 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
eb20: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
eb30: 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
eb40: 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
eb50: 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
eb60: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
eb70: 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65  pFKey[1];.  pFKe
eb80: 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63  y->aCol = (struc
eb90: 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20  t sColMap*)z;.  
eba0: 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75  z += sizeof(stru
ebb0: 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c  ct sColMap)*nCol
ebc0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
ebd0: 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
ebe0: 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
ebf0: 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
ec00: 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
ec10: 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  1;.  pFKey->pNex
ec20: 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  tTo = 0;.  pFKey
ec30: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
ec40: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
ec50: 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
ec60: 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
ec70: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
ec80: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
ec90: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
eca0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
ecb0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
ecc0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
ecd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
ece0: 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
ecf0: 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
ed00: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
ed10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
ed20: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
ed30: 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
ed40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ed50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ed60: 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
ed70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ed80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ed90: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
eda0: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
edb0: 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
edc0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
edd0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
ede0: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
edf0: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
ee00: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
ee10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ee20: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
ee30: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
ee40: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
ee50: 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c   = strlen(pToCol
ee60: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
ee70: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
ee80: 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
ee90: 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
eea0: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
eeb0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
eec0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
eed0: 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
eee0: 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
eef0: 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
ef00: 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66  ->deleteConf = f
ef10: 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70  lags & 0xff;.  p
ef20: 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66  FKey->updateConf
ef30: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29   = (flags >> 8 )
ef40: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
ef50: 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28  ->insertConf = (
ef60: 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20  flags >> 16 ) & 
ef70: 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  0xff;..  /* Link
ef80: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
ef90: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
efa0: 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
efb0: 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
efc0: 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
efd0: 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
efe0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
eff0: 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
f000: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f010: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
f020: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
f030: 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d  ListDelete(pFrom
f040: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
f050: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54  xprListDelete(pT
f060: 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
f070: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f080: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
f090: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
f0a0: 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
f0b0: 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
f0c0: 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
f0d0: 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
f0e0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
f0f0: 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
f100: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
f110: 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
f120: 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
f130: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
f140: 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
f150: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
f160: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
f170: 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
f180: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
f190: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
f1a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
f1b0: 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
f1c0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
f1d0: 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
f1e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f1f0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
f200: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
f210: 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
f220: 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
f230: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
f240: 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
f250: 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
f260: 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44  rn;.  pFKey->isD
f270: 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65  eferred = isDefe
f280: 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
f290: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f2a0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
f2b0: 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
f2c0: 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
f2d0: 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
f2e0: 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
f2f0: 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
f300: 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
f310: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
f320: 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
f330: 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
f340: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
f350: 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
f360: 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
f370: 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
f380: 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
f390: 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
f3a0: 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c    The memory cel
f3b0: 6c 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  l specified by m
f3c0: 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
f3d0: 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
f3e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
f3f0: 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
f400: 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
f410: 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
f420: 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
f430: 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
f440: 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
f450: 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
f460: 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
f470: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
f480: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
f490: 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
f4a0: 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
f4b0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
f4c0: 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
f4d0: 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
f4e0: 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
f4f0: 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
f500: 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
f510: 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
f520: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
f530: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
f540: 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
f550: 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74  Tab;       /* Bt
f560: 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
f570: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
f580: 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
f590: 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20  >nTab+1;     /* 
f5a0: 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
f5b0: 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
f5c0: 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
f5f0: 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
f600: 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f620: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
f630: 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
f640: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
f650: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
f660: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
f670: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
f680: 69 6e 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ine */..#ifndef 
f690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
f6a0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
f6b0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f6c0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
f6d0: 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d  REINDEX, pIndex-
f6e0: 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
f6f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
f700: 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e  [pIndex->iDb].zN
f710: 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
f720: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
f730: 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 6c 6c  .  /* Ensure all
f740: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
f750: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f760: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  s are available.
f770: 20 54 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69   This.  ** routi
f780: 6e 65 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74  ne will invoke t
f790: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65  he collation-nee
f7a0: 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ded callback if 
f7b0: 6e 65 63 65 73 73 61 72 79 20 28 61 6e 64 0a 20  necessary (and. 
f7c0: 20 2a 2a 20 69 66 20 6f 6e 65 20 68 61 73 20 62   ** if one has b
f7d0: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 29 2e  een registered).
f7e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
f7f0: 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c  te3CheckIndexCol
f800: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e  lSeq(pParse, pIn
f810: 64 65 78 29 20 29 7b 0a 20 20 20 20 72 65 74 75  dex) ){.    retu
f820: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  rn;.  }..  v = s
f830: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f840: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
f850: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
f860: 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
f870: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
f880: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
f890: 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50  emLoad, memRootP
f8a0: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75  age, 0);.    tnu
f8b0: 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 0;.  }else{.
f8c0: 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
f8d0: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  x->tnum;.    sql
f8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f8f0: 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
f900: 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
f910: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
f920: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f930: 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  ger, pIndex->iDb
f940: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
f950: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
f960: 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e  nWrite, iIdx, tn
f970: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
f980: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26          (char*)&
f990: 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c  pIndex->keyInfo,
f9a0: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
f9b0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
f9c0: 46 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 69 54  ForReading(v, iT
f9d0: 61 62 2c 20 70 54 61 62 29 3b 0a 20 20 61 64 64  ab, pTab);.  add
f9e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
f9f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
fa00: 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
fa10: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
fa20: 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
fa30: 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20  x, iTab);.  if( 
fa40: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
fa50: 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
fa60: 69 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71  int curaddr = sq
fa70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fa80: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74  Addr(v);.    int
fa90: 20 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72   addr2 = curaddr
faa0: 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +4;.    sqlite3V
fab0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63  dbeChangeP2(v, c
fac0: 75 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29  uraddr-1, addr2)
fad0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fae0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
faf0: 69 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  id, iTab, 0);.  
fb00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fb10: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
fb20: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
fb30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fb40: 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64  OP_IsUnique, iId
fb50: 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73  x, addr2);.    s
fb60: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
fb70: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
fb80: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f  _CONSTRAINT, OE_
fb90: 41 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Abort,.         
fba0: 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65             "inde
fbb0: 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
fbc0: 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
fbd0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73  STATIC);.    ass
fbe0: 65 72 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69  ert( addr2==sqli
fbf0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
fc00: 64 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73  dr(v) );.  }.  s
fc10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fc20: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
fc30: 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c   iIdx, 0);.  sql
fc40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fc50: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
fc60: 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69  addr1+1);.  sqli
fc70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
fc80: 76 2c 20 61 64 64 72 31 2c 20 73 71 6c 69 74 65  v, addr1, sqlite
fc90: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
fca0: 28 76 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (v));.  sqlite3V
fcb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
fcc0: 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a  lose, iTab, 0);.
fcd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fce0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
fcf0: 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  iIdx, 0);.}../*.
fd00: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
fd10: 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
fd20: 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
fd30: 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
fd40: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
fd50: 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
fd60: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
fd70: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
fd80: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
fd90: 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
fda0: 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
fdb0: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
fdc0: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
fdd0: 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
fde0: 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
fdf0: 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
fe00: 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
fe10: 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
fe20: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
fe30: 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
fe40: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
fe50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fe60: 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
fe70: 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
fe80: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
fe90: 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
fea0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
feb0: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
fec0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
fed0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
fee0: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
fef0: 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
ff00: 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
ff10: 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
ff20: 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
ff30: 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
ff40: 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
ff50: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
ff60: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
ff70: 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
ff80: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
ff90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ffa0: 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
ffb0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
ffc0: 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
ffd0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
ffe0: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
fff0: 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
10000 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
10010 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
10020 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
10030 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
10040 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
10050 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
10060 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
10070 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
10080 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
10090 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
100a0 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
100b0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
100c0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
100d0 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
100e0 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
100f0 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
10100 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
10110 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
10120 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
10130 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
10140 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43   that begins a C
10150 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
10160 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
10170 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a   *pEnd        /*
10180 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c   The ")" that cl
10190 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20  oses the CREATE 
101a0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
101b0 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
101c0 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54 61  Tab = 0;   /* Ta
101d0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
101e0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
101f0 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65  ndex = 0; /* The
10200 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
10210 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
10220 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
10230 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
10240 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b  ullId;    /* Fak
10250 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
10260 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
10270 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
10280 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
10290 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
102a0 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
102b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
102c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
102d0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
102e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
102f0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
10300 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
10310 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10320 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c  e = 0; /* Unqual
10330 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
10340 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
10350 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72  e */..  if( pPar
10360 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
10370 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
10380 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
10390 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f  eate_index;..  /
103a0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
103b0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
103c0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
103d0 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
103e0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
103f0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
10400 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
10410 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
10420 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
10430 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
10440 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
10450 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
10460 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
10470 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
10480 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
10490 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
104a0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
104b0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
104c0 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
104d0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
104e0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
104f0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10500 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
10510 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
10520 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10530 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  x;..#ifndef SQLI
10540 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
10550 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
10560 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
10570 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
10580 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
10590 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
105a0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
105b0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
105c0 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  to 1..    */.   
105d0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
105e0 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
105f0 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
10600 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26      if( pName2 &
10610 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  & pName2->n==0 &
10620 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
10630 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
10640 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  iDb = 1;.    }.#
10650 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
10660 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
10670 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
10680 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
10690 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
106a0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
106b0 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
106c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
106d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
106e0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
106f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
10700 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
10710 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
10720 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
10730 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
10740 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69  Database);.    i
10750 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
10760 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10770 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  x;.    assert( i
10780 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b  Db==pTab->iDb );
10790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
107a0 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
107b0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
107c0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
107d0 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d  .    iDb = pTab-
107e0 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  >iDb;.  }..  if(
107f0 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
10800 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
10810 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10820 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
10830 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
10840 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10850 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
10860 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
10870 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
10880 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
10890 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
108a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
108b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
108c0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
108d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
108e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
108f0 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
10900 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
10910 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10920 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
10930 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
10940 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
10950 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
10960 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
10970 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
10980 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
10990 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
109a0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
109b0 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
109c0 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
109d0 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
109e0 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
109f0 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
10a00 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
10a10 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
10a20 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
10a30 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
10a40 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
10a50 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
10a60 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
10a70 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
10a80 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
10a90 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
10aa0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
10ab0 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
10ac0 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
10ad0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
10ae0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
10af0 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
10b00 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
10b10 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
10b20 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
10b30 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
10b40 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
10b50 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
10b60 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
10b70 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
10b80 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
10b90 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
10ba0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
10bb0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
10bc0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10bd0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
10be0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
10bf0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10c00 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ex;.    if( SQLI
10c10 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
10c20 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
10c30 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
10c40 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
10c50 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
10c60 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
10c70 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10c80 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d      Index *pISam
10c90 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f  eName;    /* Ano
10ca0 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20  ther index with 
10cb0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f  the same name */
10cc0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
10cd0 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
10ce0 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
10cf0 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
10d00 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
10d10 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
10d20 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
10d30 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
10d40 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10d50 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61 6d        if( (pISam
10d60 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
10d70 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
10d80 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
10d90 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20  .zName))!=0 ){. 
10da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
10db0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10dc0 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
10dd0 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
10de0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
10df0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10e10 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20  if( (pTSameName 
10e20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
10e30 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
10e40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
10e50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10e60 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
10e70 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
10e80 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
10e90 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
10ea0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10eb0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
10ec0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
10ed0 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
10ee0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
10ef0 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
10f00 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
10f10 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
10f20 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
10f30 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
10f40 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
10f50 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "_%d",n);.    zN
10f60 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
10f70 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
10f80 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75  Name, "sqlite_au
10f90 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d  toindex_", pTab-
10fa0 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63  >zName, zBuf, (c
10fb0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28  har*)0);.    if(
10fc0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
10fd0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10fe0 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ex;.  }..  /* Ch
10ff0 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
11000 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
11010 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
11020 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11030 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11040 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
11050 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
11060 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
11070 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
11080 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11090 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
110a0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
110b0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
110c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
110d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
110e0 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
110f0 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
11100 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
11110 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
11120 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
11130 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
11140 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11150 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
11160 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
11170 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
11180 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11190 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
111a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
111b0 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
111c0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
111d0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
111e0 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
111f0 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
11200 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
11210 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
11220 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
11230 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
11240 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
11250 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
11260 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
11270 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
11280 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
11290 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
112a0 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
112b0 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
112c0 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
112d0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
112e0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
112f0 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20  , 0, &nullId);. 
11300 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
11310 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11320 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
11330 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
11340 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
11350 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
11360 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d  pIndex = sqliteM
11370 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e  alloc( sizeof(In
11380 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  dex) + strlen(zN
11390 61 6d 65 29 20 2b 20 31 20 2b 20 73 69 7a 65 6f  ame) + 1 + sizeo
113a0 66 28 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20  f(int) +.       
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 32 20   (sizeof(int)*2 
113d0 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  + sizeof(CollSeq
113e0 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72  *))*pList->nExpr
113f0 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
11400 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
11410 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11420 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
11430 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
11440 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65  int*)&pIndex->ke
11450 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73  yInfo.aColl[pLis
11460 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49 6e  t->nExpr];.  pIn
11470 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
11480 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
11490 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  n[pList->nExpr];
114a0 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
114b0 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
114c0 78 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4c 69 73  x->aiRowEst[pLis
114d0 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b 0a 20 20 73  t->nExpr+1];.  s
114e0 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  trcpy(pIndex->zN
114f0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70  ame, zName);.  p
11500 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
11510 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
11520 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
11530 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
11540 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
11550 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
11560 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65  utoIndex = pName
11570 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  ==0;.  pIndex->i
11580 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20  Db = iDb;..  /* 
11590 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
115a0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
115b0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
115c0 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
115d0 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
115e0 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
115f0 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
11600 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
11610 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
11620 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
11630 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
11640 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
11650 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11660 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
11670 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
11680 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
11690 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
116a0 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
116b0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
116c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
116d0 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
116e0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
116f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11700 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
11710 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
11720 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
11730 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70    pTab->zName, p
11740 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
11750 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
11760 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11770 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
11780 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
11790 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
117a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b  t->a[i].pExpr ){
117b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
117c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
117d0 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
117e0 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
117f0 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73  .aColl[i] = pLis
11800 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
11810 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Coll;.    }else{
11820 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
11830 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
11840 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
11850 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  pColl;.    }.   
11860 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
11870 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
11880 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ] );.    if( !db
11890 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a  ->init.busy && .
118a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
118b0 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
118c0 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  se, pIndex->keyI
118d0 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20  nfo.aColl[i]) . 
118e0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
118f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11900 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ex;.    }.  }.  
11910 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
11920 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e  nField = pList->
11930 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
11940 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
11950 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
11960 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
11970 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
11980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
11990 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
119a0 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
119b0 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
119c0 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
119d0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
119e0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
119f0 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
11a00 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
11a10 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
11a20 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
11a30 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
11a40 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
11a50 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
11a60 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
11a70 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
11a80 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
11a90 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
11aa0 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
11ab0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
11ac0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
11ad0 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
11ae0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
11af0 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
11b00 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
11b10 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
11b20 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
11b30 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
11b40 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
11b50 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
11b60 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
11b70 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
11b80 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
11b90 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
11ba0 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
11bb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
11bc0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
11bd0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11be0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
11bf0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
11c00 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
11c10 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
11c20 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
11c30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11c40 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
11c50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11c60 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
11c70 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
11c80 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
11c90 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
11ca0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
11cb0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
11cc0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
11cd0 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
11ce0 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
11cf0 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
11d00 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
11d10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
11d20 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
11d30 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  Coll[k]!=pIndex-
11d40 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b  >keyInfo.aColl[k
11d50 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
11d60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
11d70 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
11d80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
11d90 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
11da0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
11db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
11dc0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
11dd0 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
11de0 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
11df0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
11e00 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
11e10 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
11e20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
11e30 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
11e40 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
11e50 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
11e60 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
11e70 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
11e80 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
11e90 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
11ea0 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
11eb0 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
11ec0 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
11ed0 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
11ee0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
11ef0 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
11f00 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
11f10 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
11f20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
11f30 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
11f40 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64  iour for the ind
11f50 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
11f60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
11f70 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
11f80 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
11f90 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
11fa0 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
11fb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11fc0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11fd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
11fe0 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
11ff0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
12000 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
12010 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
12020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
12030 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
12040 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
12050 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
12060 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
12070 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
12080 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
12090 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
120a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
120b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
120c0 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
120d0 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
120e0 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
120f0 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
12100 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
12110 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
12120 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
12130 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
12140 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
12150 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
12160 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
12170 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
12180 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
121b0 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
121c0 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
121d0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
121e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
121f0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
12200 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
12210 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
12220 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12230 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12240 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
12250 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
12260 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
12270 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
12280 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
12290 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
122a0 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
122b0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
122c0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
122d0 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
122e0 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
122f0 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
12300 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
12310 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
12320 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
12330 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
12340 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
12350 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
12360 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
12370 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
12380 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
12390 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
123a0 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
123b0 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
123c0 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
123d0 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
123e0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
123f0 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
12400 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
12410 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
12420 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
12430 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
12440 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
12450 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
12460 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
12470 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
12480 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
12490 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
124a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
124b0 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
124c0 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
124d0 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
124e0 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
124f0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
12500 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
12510 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
12520 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
12530 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
12540 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
12550 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
12560 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
12570 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
12580 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
12590 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
125a0 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
125b0 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
125c0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
125d0 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
125e0 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
125f0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76  ->nMem++;..    v
12600 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12610 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
12620 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
12630 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12640 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
12650 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
12660 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
12670 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
12680 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
12690 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
126a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
126b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
126c0 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
126d0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
126e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
126f0 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30  emStore, iMem, 0
12700 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65  );..    /* Gathe
12710 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
12720 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
12730 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
12740 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68  t into.    ** th
12750 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
12760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12770 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
12780 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  {.      /* A nam
12790 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
127a0 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
127b0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
127c0 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
127d0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
127e0 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58  ("CREATE%s INDEX
127f0 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
12800 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
12810 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
12820 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d  ",.        pEnd-
12830 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20  >z - pName->z + 
12840 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  1,.        pName
12850 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
12860 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
12870 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
12880 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
12890 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
128a0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
128b0 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
128c0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
128d0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
128e0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
128f0 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
12900 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
12910 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
12920 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
12930 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
12940 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
12950 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
12960 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
12970 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b  x',%Q,%Q,#0,%Q);
12980 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
12990 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
129a0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
129b0 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ,.        pIndex
129c0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
129d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
129e0 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
129f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12a00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
12a10 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
12a20 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b  liteFree(zStmt);
12a30 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
12a40 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
12a50 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
12a60 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
12a70 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
12a80 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
12a90 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
12aa0 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
12ab0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62    */.    if( pTb
12ac0 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
12ad0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
12ae0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
12af0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
12b00 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
12b10 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
12b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12b30 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
12b40 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a  Schema, iDb, 0,.
12b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12b60 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25  MPrintf("name='%
12b70 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  q'", pIndex->zNa
12b80 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
12b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12ba0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45  dbeAddOp(v, OP_E
12bb0 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20  xpire, 0, 0);.  
12bc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
12bd0 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
12be0 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
12bf0 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
12c00 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
12c10 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
12c20 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
12c30 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
12c40 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
12c50 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
12c60 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
12c70 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
12c80 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
12c90 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
12ca0 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
12cb0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
12cc0 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
12cd0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
12ce0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
12cf0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
12d00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
12d10 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
12d20 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
12d30 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
12d40 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
12d50 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
12d60 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
12d70 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
12d80 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
12d90 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
12da0 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
12db0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
12dc0 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
12dd0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
12de0 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
12df0 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
12e00 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
12e10 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
12e20 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
12e30 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
12e40 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
12e50 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
12e60 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
12e70 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
12e80 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
12e90 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
12ea0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
12eb0 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
12ec0 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
12ed0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
12ee0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
12ef0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
12f00 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  te(pTblName);.  
12f10 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
12f20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
12f30 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
12f40 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
12f50 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
12f60 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
12f70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
12f80 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
12f90 77 65 20 68 61 76 65 20 6e 6f 20 41 4e 41 4c 59  we have no ANALY
12fa0 5a 45 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 75  ZE command to ru
12fb0 6e 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  n..**.** aiRowEs
12fc0 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20  t[0] is suppose 
12fd0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
12fe0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
12ff0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
13000 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
13010 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
13020 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
13030 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
13040 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
13050 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
13060 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
13070 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
13080 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
13090 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
130a0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
130b0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
130c0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
130d0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
130e0 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
130f0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
13100 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20  combiniation of 
13110 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
13120 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
13130 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
13140 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
13150 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
13160 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
13170 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
13180 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
13190 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
131a0 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
131b0 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
131c0 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
131d0 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
131e0 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
131f0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
13200 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
13210 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
13220 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
13230 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
13240 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
13250 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
13260 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
13270 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
13280 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
13290 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
132a0 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
132b0 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Est;.  int i;.  
132c0 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a  assert( a!=0 );.
132d0 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30    a[0] = 1000000
132e0 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e  ;.  for(i=pIdx->
132f0 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31 3b 20 69  nColumn; i>=1; i
13300 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  --){.    a[i] = 
13310 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  10;.  }.  if( pI
13320 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
13330 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49  None ){.    a[pI
13340 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31  dx->nColumn] = 1
13350 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
13360 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13370 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
13380 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
13390 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
133a0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
133b0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
133c0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
133d0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
133e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
133f0 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  List *pName){.  
13400 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
13410 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
13420 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13430 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
13440 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
13450 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
13460 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
13470 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13480 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
13490 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
134a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
134b0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
134c0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
134d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
134e0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
134f0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
13500 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
13510 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
13520 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13530 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
13540 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
13550 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13560 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
13570 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
13580 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
13590 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
135a0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
135b0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
135c0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
135d0 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
135e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
135f0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
13600 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
13610 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
13620 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
13630 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
13640 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
13650 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13660 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
13670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13680 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13690 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
136a0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
136b0 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
136c0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
136d0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
136e0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
136f0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
13700 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
13710 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
13720 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
13730 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
13740 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13750 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13760 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
13770 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
13780 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13790 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
137a0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
137b0 4d 50 44 42 20 26 26 20 70 49 6e 64 65 78 2d 3e  MPDB && pIndex->
137c0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
137d0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
137e0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
137f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13800 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
13810 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
13820 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
13830 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13840 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
13850 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13860 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13870 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
13880 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
13890 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
138a0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
138b0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
138c0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
138d0 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d  nt iDb = pIndex-
138e0 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
138f0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13900 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
13910 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
13920 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
13930 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
13940 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
13950 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
13960 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
13970 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
13980 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
13990 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
139a0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
139b0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
139c0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
139d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
139e0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
139f0 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78  , iDb, 0, pIndex
13a00 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
13a10 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
13a20 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
13a30 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
13a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
13a50 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
13a60 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
13a70 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
13a80 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
13a90 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
13aa0 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
13ab0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
13ac0 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
13ad0 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
13ae0 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
13af0 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
13b00 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
13b10 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
13b20 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
13b30 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
13b40 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
13b50 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
13b60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
13b70 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
13b80 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
13b90 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d  ist->nId>=pList-
13ba0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73  >nAlloc ){.    s
13bb0 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
13bc0 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d  m *a;.    pList-
13bd0 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d  >nAlloc = pList-
13be0 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20  >nAlloc*2 + 5;. 
13bf0 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
13c00 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
13c10 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
13c20 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
13c30 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
13c40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13c50 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
13c60 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
13c70 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
13c80 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
13c90 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73  }.  memset(&pLis
13ca0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
13cb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
13cc0 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69  t->a[0]));.  pLi
13cd0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
13ce0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
13cf0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
13d00 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d  Token);.  pList-
13d10 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
13d20 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
13d30 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
13d40 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
13d50 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49  e3IdListDelete(I
13d60 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
13d70 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
13d80 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
13d90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
13da0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
13db0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
13dc0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
13dd0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
13de0 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
13df0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
13e00 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
13e10 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
13e20 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
13e30 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
13e40 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
13e50 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
13e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
13e70 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
13e80 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
13e90 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
13ea0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
13eb0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
13ec0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13ed0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
13ee0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13ef0 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
13f00 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
13f10 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
13f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
13f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
13f40 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
13f50 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
13f60 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
13f70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
13f80 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
13f90 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
13fa0 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
13fb0 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
13fc0 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
13fd0 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
13fe0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
13ff0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
14000 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
14010 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
14020 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
14030 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
14040 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
14050 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
14060 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
14070 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
14080 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
14090 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
140a0 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
140b0 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
140c0 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
140d0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
140e0 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
140f0 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
14100 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
14110 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
14120 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
14130 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
14140 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
14150 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
14160 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
14170 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
14180 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
14190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
141a0 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
141b0 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
141c0 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
141d0 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
141e0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
141f0 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
14200 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
14210 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
14220 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
14230 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
14240 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
14250 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
14260 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
14270 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
14280 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
14290 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
142a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
142b0 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
142c0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
142d0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
142e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
142f0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
14300 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
14310 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
14320 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
14330 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
14340 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53  ase){.  struct S
14350 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
14360 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
14370 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
14380 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
14390 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
143a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
143b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
143c0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
143d0 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
143e0 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
143f0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
14400 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
14410 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
14420 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
14430 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
14440 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
14450 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
14460 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
14470 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
14480 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
14490 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
144a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
144b0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
144c0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
144d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
144e0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
144f0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
14500 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
14510 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
14520 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
14530 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
14540 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
14550 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
14560 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
14570 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
14580 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
14590 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
145a0 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
145b0 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
145c0 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
145d0 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
145e0 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
145f0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
14600 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
14610 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
14620 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
14630 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
14640 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70  (pDatabase);.  p
14650 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
14660 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72  -1;.  pList->nSr
14670 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
14680 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
14690 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20  sign cursors to 
146a0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
146b0 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
146c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
146d0 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
146e0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
146f0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
14700 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
14710 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14720 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  m;.  for(i=0, pI
14730 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
14740 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
14750 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14760 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
14770 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
14780 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
14790 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
147a0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ++;.    if( pIte
147b0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
147c0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
147d0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
147e0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
147f0 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
14800 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14810 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
14820 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
14830 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
14840 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
14850 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
14860 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69  te3SrcListAddAli
14870 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
14880 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
14890 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
148a0 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
148b0 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
148c0 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a  pList->nSrc-1].z
148d0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
148e0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
148f0 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ken);.  }.}../*.
14900 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
14910 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
14920 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
14930 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
14940 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
14950 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
14960 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
14970 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
14980 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
14990 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
149a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
149b0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
149c0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
149d0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
149e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
149f0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
14a00 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
14a10 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
14a20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
14a30 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
14a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
14a50 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
14a60 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
14a70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14a80 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
14a90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14aa0 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
14ab0 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
14ac0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
14ad0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
14ae0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
14af0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
14b00 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
14b10 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
14b20 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
14b30 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
14b40 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
14b50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14b60 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
14b70 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14b80 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14b90 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14ba0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14bb0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14bc0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14bd0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14be0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
14bf0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14c00 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14c10 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
14c20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
14c30 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
14c40 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14c50 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
14c60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14c70 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
14c80 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
14c90 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14ca0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
14cb0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14cc0 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
14cd0 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
14ce0 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  SIVE)+1);.    }.
14cf0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14d00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
14d10 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
14d20 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
14d30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
14d40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
14d50 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
14d60 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14d70 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14d80 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
14d90 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14da0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14db0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14dc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14dd0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14de0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14df0 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14e00 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14e10 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14e20 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14e30 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
14e40 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14e50 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14e60 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14e70 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
14e80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e90 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
14ea0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
14eb0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
14ec0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
14ed0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
14ee0 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
14ef0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
14f00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
14f10 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
14f20 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
14f30 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
14f40 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
14f50 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
14f60 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
14f70 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
14f80 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
14f90 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
14fa0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14fb0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
14fc0 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
14fd0 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
14fe0 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
14ff0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15000 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
15010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15020 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
15030 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
15040 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
15050 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
15060 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
15070 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
15080 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
15090 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
150a0 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
150b0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
150c0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
150d0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
150e0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  tic int sqlite3O
150f0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
15100 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15120 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
15130 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
15140 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
15150 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
15160 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
15170 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
15180 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
15190 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
151a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
151b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
151c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
151d0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
151e0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
151f0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
15200 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
15210 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
15220 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
15230 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
15240 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
15250 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
15260 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
15270 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
15280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
15290 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
152a0 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
152b0 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
152c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
152d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
152e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
152f0 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
15300 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
15310 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
15320 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
15330 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
15340 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
15350 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
15360 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
15370 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
15380 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
15390 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
153a0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
153b0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
153c0 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
153d0 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
153e0 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
153f0 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
15400 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
15410 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
15420 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
15430 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
15440 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
15450 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
15460 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
15470 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
15480 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
15490 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
154a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
154b0 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
154c0 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
154d0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
154e0 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
154f0 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
15500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
15510 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
15520 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
15530 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
15540 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
15550 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
15560 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
15570 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
15580 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
15590 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
155a0 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
155b0 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
155c0 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
155d0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
155e0 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
155f0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
15600 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
15610 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
15620 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
15630 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
15640 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
15650 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
15660 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
15670 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
15680 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
15690 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
156a0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
156b0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
156c0 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
156d0 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
156e0 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
156f0 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
15700 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
15710 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
15720 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
15730 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
15740 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
15750 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
15760 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
15770 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
15780 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
15790 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
157a0 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
157b0 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
157c0 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
157d0 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
157e0 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
157f0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
15800 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
15810 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
15820 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
15830 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
15840 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
15850 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
15860 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15870 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
15880 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
15890 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
158a0 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
158b0 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
158c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
158d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
158e0 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
158f0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15900 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
15910 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
15920 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
15930 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
15940 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
15950 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
15960 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
15970 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
15980 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
15990 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20  ert( iDb<32 );. 
159a0 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
159b0 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
159c0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
159d0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
159e0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
159f0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
15a00 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
15a10 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
15a20 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
15a30 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
15a40 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
15a50 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
15a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
15a70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
15a80 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
15a90 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15aa0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
15ab0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
15ac0 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
15ad0 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
15ae0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
15af0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15b00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15b10 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
15b20 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
15b30 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
15b40 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
15b50 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
15b60 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
15b70 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
15b80 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
15b90 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
15ba0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
15bb0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
15bc0 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
15bd0 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
15be0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
15bf0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
15c00 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
15c10 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
15c20 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
15c30 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
15c40 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
15c50 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
15c60 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
15c70 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
15c80 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
15c90 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
15ca0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
15cb0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
15cc0 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
15cd0 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
15ce0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
15cf0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
15d00 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
15d10 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
15d20 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
15d30 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
15d40 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  set..**.** Only 
15d50 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64  database iDb and
15d60 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15d70 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
15d80 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c  able by this cal
15d90 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c  l..** If iDb==0,
15da0 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61   then the main a
15db0 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  nd temp database
15dc0 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  s are made writa
15dd0 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62  ble.   If.** iDb
15de0 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  ==1 then only th
15df0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
15e00 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
15e10 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e  .  If iDb>1 then
15e20 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
15e30 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  d auxiliary data
15e40 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d  base and the tem
15e50 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
15e60 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ade writable..*/
15e70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
15e80 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
15e90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15ea0 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
15eb0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
15ec0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
15ed0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15ee0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
15ef0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  urn;.  sqlite3Co
15f00 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
15f10 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
15f20 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
15f30 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66   |= 1<<iDb;.  if
15f40 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26  ( setStatement &
15f50 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
15f60 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
15f70 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15f80 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62  P_Statement, iDb
15f90 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
15fa0 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  (OMIT_TEMPDB || 
15fb0 69 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73  iDb!=1) && pPars
15fc0 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  e->db->aDb[1].pB
15fd0 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t!=0 ){.    sqli
15fe0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
15ff0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73  ration(pParse, s
16000 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b  etStatement, 1);
16010 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
16020 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
16030 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
16040 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16050 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
16060 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
16070 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
16080 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
16090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
160a0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
160b0 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
160c0 4d 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70  Match(CollSeq *p
160d0 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
160e0 64 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  dex){.  int n = 
160f0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
16100 6e 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65  nField;.  CollSe
16110 71 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d  q **pp = pIndex-
16120 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a  >keyInfo.aColl;.
16130 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a    while( n-- ){.
16140 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f      if( *pp==pCo
16150 6c 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ll ) return 1;. 
16160 20 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72     pp++;.  }.  r
16170 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
16180 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
16190 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
161a0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
161b0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
161c0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
161d0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
161e0 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
161f0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
16200 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16210 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
16220 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
16230 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
16240 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
16250 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  Tab, CollSeq *pC
16260 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
16270 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
16280 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
16290 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
162a0 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
162b0 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
162c0 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
162d0 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
162e0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ){.    if( pColl
162f0 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
16300 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64  Match(pColl,pInd
16310 65 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ex) ){.      sql
16320 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16330 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16340 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  0, pTab->iDb);. 
16350 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
16360 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
16370 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
16380 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
16390 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
163a0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
163b0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
163c0 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
163d0 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
163e0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
163f0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
16400 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
16410 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
16420 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
16430 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
16440 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16450 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
16460 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
16470 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
16480 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  rse, CollSeq *pC
16490 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
164c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
164d0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
164e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
164f0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
16500 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
16510 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16520 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
16530 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16540 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
16550 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
16560 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
16570 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
16580 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
16590 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
165a0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
165b0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
165c0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d  e */..  for(iDb=
165d0 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
165e0 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
165f0 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
16600 69 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e  if( pDb==0 ) con
16610 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6b  tinue;.    for(k
16620 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
16630 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b  (&pDb->tblHash);
16640 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
16650 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
16660 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
16670 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
16680 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
16690 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
166a0 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, pColl);.    
166b0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
166c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
166d0 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
166e0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
166f0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
16700 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
16720 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
16730 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
16750 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
16760 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
16770 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
16780 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
16790 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
167a0 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
167b0 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
167c0 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
167d0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
167e0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
167f0 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
16800 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
16810 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
16820 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
16830 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
16840 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
16850 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
16860 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
16870 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
16880 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
16890 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
168a0 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
168b0 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
168c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
168d0 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
168e0 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
168f0 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
16900 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
16910 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
16920 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
16930 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
16940 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
16950 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
16960 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
16990 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
169a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
169b0 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
169c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
169d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
169e0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
169f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
16a00 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
16a10 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
16a20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
16a30 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
16a40 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
16a50 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
16a60 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
16a70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
16a80 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
16a90 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
16aa0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16ab0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
16ac0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16ad0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
16ae0 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
16af0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16b00 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
16b10 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
16b20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
16b30 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
16b40 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
16b50 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
16b60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
16b70 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
16b80 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
16b90 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
16ba0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
16bb0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
16bc0 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
16bd0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
16be0 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d  Name1==0 || pNam
16bf0 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e1->z==0 ){.    
16c00 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
16c10 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
16c20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
16c30 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c   if( pName2==0 |
16c40 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
16c50 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
16c60 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
16c70 28 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e  (db, db->enc, pN
16c80 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d  ame1->z, pName1-
16c90 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
16ca0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
16cb0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
16cc0 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a  pParse, pColl);.
16cd0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
16ce0 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20    }.  }.  iDb = 
16cf0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
16d00 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
16d10 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
16d20 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
16d30 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
16d40 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
16d50 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65  omToken(pObjName
16d60 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  );.  zDb = db->a
16d70 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
16d80 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
16d90 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
16da0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
16db0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
16dc0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
16dd0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
16de0 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65  eFree(z);.    re
16df0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
16e00 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
16e10 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
16e20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
16e30 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
16e40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
16e50 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
16e60 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
16e70 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
16e80 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
16e90 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
16ea0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16eb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16ec0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
16ed0 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
16ee0 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
16ef0 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
16f00 6e 64 69 66 0a                                   ndif.