/ Hex Artifact Content
Login

Artifact 61a0beac459a495f05622132559926d88757e20c:


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 31 39 20 32 30 30 35 2f 30 35 2f 30 33  1.319 2005/05/03
02f0: 20 31 32 3a 33 30 3a 33 34 20 64 72 68 20 45 78   12:30:34 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 65 6c 65  turn;..  /* Dele
34e0: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
34f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3500: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
3510: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
3520: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
3530: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
3540: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3550: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3560: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3570: 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d  ex->iDb==pTable-
3580: 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d  >iDb || (pTable-
3590: 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65  >iDb==0 && pInde
35a0: 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20  x->iDb==1) );.  
35b0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
35c0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
35d0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
35e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
35f0: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3600: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3610: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3620: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3630: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3640: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3650: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3660: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b  from the db->aFK
3670: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
3680: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
3690: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
36a0: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
36b0: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
36c0: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
36d0: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
36e0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44  sert( pTable->iD
36f0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
3700: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3710: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
3720: 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61  b[pTable->iDb].a
3730: 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  FKey,.          
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72   pFKey->zTo, str
3760: 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b  len(pFKey->zTo)+
3770: 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20  1)!=pFKey );.   
3780: 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65   sqliteFree(pFKe
3790: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
37a0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
37b0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
37c0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
37d0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
37e0: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
37f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
3800: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
3810: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3820: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
3830: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3840: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
3850: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3860: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3870: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3880: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
3890: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
38a0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
38b0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
38c0: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
38d0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
38e0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
38f0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
3900: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3910: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3920: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
3930: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
3940: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
3950: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
3960: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
3970: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
3980: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3990: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
39a0: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
39b0: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
39c0: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
39d0: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
39e0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
39f0: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
3a00: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3a10: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29  (zTabName)+1, 0)
3a20: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
3a30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3a40: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3a50: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
3a60: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
3a70: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
3a80: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
3a90: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
3aa0: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
3ab0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
3ac0: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  pDb->aFKey, pF1-
3ad0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3ae0: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
3af0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3b00: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3b10: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
3b20: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
3b30: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
3b40: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
3b50: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3b60: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3b70: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3b80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3b90: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
3ba0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
3bb0: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
3bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3bd0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3be0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
3bf0: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20  le(db, p);.  }. 
3c00: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
3c10: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3c20: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
3c30: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
3c40: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
3c50: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
3c60: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
3c70: 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20   token with any 
3c80: 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76  quotations remov
3c90: 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ed.  Space to ho
3ca0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
3cb0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
3cc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3cd0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
3ce0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
3cf0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
3d00: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nction..**.** To
3d10: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
3d20: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
3d30: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
3d40: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
3d50: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
3d60: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
3d70: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
3d80: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
3d90: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
3da0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
3db0: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
3dc0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
3dd0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f  NameFromToken(To
3de0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
3df0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
3e00: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
3e10: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3e20: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
3e30: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
3e40: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3e50: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3e60: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
3e70: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
3e90: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
3ea0: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
3eb0: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
3ec0: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
3ed0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
3ee0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
3ef0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
3f00: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
3f10: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
3f20: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
3f30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3f40: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
3f50: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3f60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
3f70: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
3f80: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
3f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3fa0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
3fb0: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
3fc0: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
3fd0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
3fe0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
3ff0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
4000: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
4010: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4020: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4030: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4040: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4050: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4060: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4070: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4080: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4090: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
40a0: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
40b0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
40c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
40d0: 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  findDb(sqlite3 *
40e0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
40f0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4100: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4110: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
4120: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
4130: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
4140: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
4150: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4160: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4170: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4180: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4190: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
41a0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
41b0: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
41c0: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
41d0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
41e0: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
41f0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4200: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e     n = strlen(zN
4210: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
4220: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
4230: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
4240: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
4250: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4260: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4270: 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28   ) && n==strlen(
4280: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
4290: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
42a0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
42b0: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
42c0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
42d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
42e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
42f0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
4300: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
4310: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
4320: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
4330: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
4340: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
4350: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4360: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4370: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4380: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4390: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
43a0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
43b0: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
43c0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
43d0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
43e0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
43f0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
4400: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
4410: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
4420: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
4430: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
4440: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
4450: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4460: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4470: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4480: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4490: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
44a0: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
44b0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
44c0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
44d0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
44e0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
44f0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
4500: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
4510: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
4520: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
4530: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
4540: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
4550: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4560: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4570: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4580: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4590: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
45a0: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
45b0: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
45c0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
45d0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
45e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
45f0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
4600: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
4610: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
4620: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
4630: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
4640: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
4650: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
4660: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4680: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
4690: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
46a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
46b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
46c0: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
46d0: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
46e0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
46f0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
4700: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
4710: 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62      iDb = findDb
4720: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
4730: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
4740: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4750: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
4760: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
4770: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
4780: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4790: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
47a0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
47b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
47c0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
47d0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
47e0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
47f0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
4800: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
4810: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
4820: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
4830: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4840: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
4850: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
4860: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
4870: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
4880: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
4890: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
48a0: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
48b0: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
48c0: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
48d0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
48e0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
48f0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
4900: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
4910: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
4920: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
4930: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
4940: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
4950: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4960: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
4970: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
4980: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
4990: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
49a0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
49b0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
49c0: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
49d0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
49e0: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
49f0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
4a00: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
4a10: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4a20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4a30: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
4a40: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4a50: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
4a60: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4a70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4a90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4aa0: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
4ab0: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
4ac0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
4ad0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
4ae0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
4af0: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
4b00: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
4b10: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
4b20: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
4b30: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4b40: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
4b50: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
4b60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
4b70: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
4b80: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
4b90: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
4ba0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4bb0: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
4bc0: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
4bd0: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
4be0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4bf0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
4c00: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
4c10: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
4c20: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
4c30: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
4c40: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
4c50: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
4c60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
4c70: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
4c80: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
4c90: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
4ca0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
4cb0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
4cc0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
4cd0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
4ce0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
4cf0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
4d00: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
4d10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4d20: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
4d30: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4d40: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
4d50: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
4d60: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
4d70: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
4d80: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
4d90: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
4da0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
4db0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4dc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4dd0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
4de0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
4df0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
4e00: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
4e10: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
4e20: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4e30: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
4e40: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
4e50: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
4e60: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
4e70: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4e80: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
4e90: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
4ea0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
4eb0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
4ec0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
4ed0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4ee0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
4ef0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
4f00: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
4f10: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
4f20: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4f30: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
4f40: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
4f50: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
4f60: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4f70: 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20  isView       /* 
4f80: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
4f90: 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54  a VIEW */.){.  T
4fa0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
4fb0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
4fc0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
4fd0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
4fe0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
4ff0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5000: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
5010: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
5020: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
5030: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
5040: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
5050: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
5060: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
5070: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
5080: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
5090: 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eate */..  /* Th
50a0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
50b0: 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69  name to create i
50c0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
50d0: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
50e0: 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20  ens.  ** pName1 
50f0: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5100: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5110: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5120: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5130: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
5140: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5150: 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ...);.  ** .  **
5160: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5170: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5180: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5190: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
51a0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62   if.  ** the tab
51b0: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
51c0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
51d0: 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  i.e.:.  **.  ** 
51e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
51f0: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  (...);.  **.  **
5200: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5210: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
5220: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20   pName2 is "".. 
5230: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
5240: 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65  l below sets the
5250: 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74   pName pointer t
5260: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5270: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5280: 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61    ** pName2) tha
5290: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
52a0: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
52b0: 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ame. The variabl
52c0: 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65  e iDb is.  ** se
52d0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
52e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
52f0: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72  hat the table or
5300: 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20   view is to be. 
5310: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a   ** created in..
5320: 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
5330: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
5340: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
5350: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
5360: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
5370: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d  eturn;.  if( !OM
5380: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5390: 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a  emp && iDb>1 ){.
53a0: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
53b0: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
53c0: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
53d0: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a  t be qualified *
53e0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
53f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5400: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
5410: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
5420: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
5430: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
5440: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5450: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
5460: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
5470: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
5480: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
5490: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
54a0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
54b0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
54c0: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
54d0: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
54e0: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
54f0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
5500: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5510: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
5520: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
5530: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
5540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5550: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5560: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
5570: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
5580: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
5590: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
55a0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
55b0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
55c0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
55d0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
55e0: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
55f0: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
5600: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
5610: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5620: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
5630: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
5640: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
5650: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5660: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
5670: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5680: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
5690: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56a0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
56b0: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
56c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
56d0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
56e0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
56f0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
5700: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5710: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
5720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5730: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5740: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
5750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5760: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5770: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
5780: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
5790: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
57a0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
57b0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
57c0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
57d0: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
57e0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
57f0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
5800: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
5810: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
5820: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
5830: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
5840: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5850: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
5860: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
5870: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
5880: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
5890: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
58a0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
58b0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
58c0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
58d0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
58e0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
58f0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
5900: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5910: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
5920: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
5930: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
5940: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5950: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5960: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
5970: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
5980: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
5990: 20 26 26 20 0a 20 20 20 20 20 20 28 20 69 44 62   && .      ( iDb
59a0: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
59b0: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71  .busy) ){.    sq
59c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
59d0: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
59e0: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
59f0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
5a00: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  e);.    goto beg
5a10: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5a20: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
5a30: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5a40: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
5a50: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
5a60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
5a70: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5a80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5a90: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
5aa0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5ab0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
5ac0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
5ad0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
5ae0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
5af0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
5b00: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
5b10: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  ble->pIndex = 0;
5b20: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d  .  pTable->iDb =
5b30: 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72   iDb;.  if( pPar
5b40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
5b50: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5b60: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  le(db, pParse->p
5b70: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
5b80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
5b90: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
5ba0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
5bb0: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
5bc0: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
5bd0: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
5be0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
5bf0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
5c00: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
5c10: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
5c20: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
5c30: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
5c40: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
5c50: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
5c60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5c70: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
5c80: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
5c90: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
5ca0: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
5cb0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65  db->aDb[iDb].pSe
5cc0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
5cd0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5ce0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
5cf0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
5d00: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
5d10: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
5d20: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
5d30: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
5d40: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
5d50: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
5d60: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
5d70: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
5d80: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
5d90: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
5da0: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
5db0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
5dc0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
5dd0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
5de0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
5df0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
5e00: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
5e10: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
5e20: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
5e30: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
5e40: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
5e50: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
5e60: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5e70: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
5e80: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
5e90: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
5ea0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
5eb0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
5ec0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
5ed0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c  0 ){.    int lbl
5ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
5ef0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
5f00: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
5f10: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
5f20: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
5f30: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
5f40: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
5f50: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
5f60: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
5f70: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  w..    */.    sq
5f80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5f90: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
5fa0: 20 69 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66   iDb, 1);   /* f
5fb0: 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile_format */.  
5fc0: 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56    lbl = sqlite3V
5fd0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ff0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
6000: 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 73 71 6c  0, lbl);.    sql
6010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6020: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
6030: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
6040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
6060: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
6070: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6080: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6090: 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29  ger, db->enc, 0)
60a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
60b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
60c0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b  Cookie, iDb, 4);
60d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
60f0: 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  lbl);..    /* Th
6100: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
6110: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
6120: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
6130: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
6140: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
6150: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
6160: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
6170: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
6180: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
6190: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
61a0: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
61b0: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
61c0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
61d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
61e0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
61f0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
6200: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
6210: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6220: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c  ** The rowid val
6230: 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  ue is needed by 
6240: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  the code that sq
6250: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
6260: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
6270: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  te..    */.#ifnd
6280: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6290: 49 45 57 0a 20 20 20 20 69 66 28 20 69 73 56 69  IEW.    if( isVi
62a0: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
62b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
62c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
62d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
62e0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
62f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6300: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6310: 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  le, iDb, 0);.   
6320: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
6330: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
6340: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
6350: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6360: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
6370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6380: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
6390: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
63a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
63b0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
63c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
63d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
63e0: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
63f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6400: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
6410: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  se, 0, 0);.    s
6420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6430: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
6440: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
6450: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
6460: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
6470: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
6480: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
6490: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
64a0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
64b0: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  :.  sqliteFree(z
64c0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
64d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
64e0: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
64f0: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
6500: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
6510: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
6520: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
6530: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
6540: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
6550: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
6560: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
6570: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
6580: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
6590: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
65a0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
65b0: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
65c0: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
65d0: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
65e0: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
65f0: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
6600: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
6610: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
6620: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
6630: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
6640: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
6650: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
6660: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
6670: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
6680: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
6690: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
66a0: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
66b0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
66c0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
66d0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
66e0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
66f0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
6700: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
6710: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
6720: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
6730: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
6740: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6750: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
6760: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
6770: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
6780: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
6790: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
67a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
67b0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
67c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
67d0: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
67e0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
67f0: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
6800: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
6810: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
6820: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
6830: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6840: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
6850: 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
6860: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
6870: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
6880: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6890: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
68a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
68b0: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
68c0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
68d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
68e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
68f0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
6900: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
6910: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6920: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
6930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6940: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
6950: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
6960: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
6970: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
6980: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
6990: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
69a0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
69b0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
69c0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
69d0: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
69e0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
69f0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
6a00: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
6a10: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
6a20: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
6a30: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
6a40: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
6a50: 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66  e = z;. .  /* If
6a60: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
6a70: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
6a80: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
6a90: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
6aa0: 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74   ** 'NONE'. If t
6ab0: 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73  here is a type s
6ac0: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
6ad0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
6ae0: 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20  ype() will.  ** 
6af0: 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74  be called next t
6b00: 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69  o set pCol->affi
6b10: 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a  nity correctly..
6b20: 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66    */.  pCol->aff
6b30: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
6b40: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d  FF_NONE;.  pCol-
6b50: 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d  >pColl = pParse-
6b60: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
6b70: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
6b80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6b90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
6ba0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
6bb0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
6bc0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
6bd0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6be0: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
6bf0: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
6c00: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
6c10: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
6c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
6c30: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
6c40: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
6c50: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
6c60: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
6c70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6c80: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
6c90: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
6ca0: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
6cb0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
6cc0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
6cd0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6ce0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
6cf0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
6d00: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
6d10: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  .notNull = onErr
6d20: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  or;.}../*.** Sca
6d30: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
6d40: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
6d50: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
6d60: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
6d70: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
6d80: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
6d90: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
6da0: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
6db0: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
6dc0: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
6dd0: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
6de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
6df0: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
6e00: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
6e10: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
6e20: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
6e30: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
6e40: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
6e50: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
6e60: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
6e70: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
6e80: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
6e90: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
6ea0: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
6eb0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
6ec0: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
6ed0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
6ee0: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
6ef0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
6f00: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
6f10: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
6f40: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
6f50: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
6f60: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
6f70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
6f80: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
6f90: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
6fa0: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
6fb0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
6fc0: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
6fd0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
6fe0: 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 0a 2a 2a 20  _AFF_NONE.**.** 
6ff0: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
7000: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
7010: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
7020: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
7030: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
7040: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7050: 61 74 69 63 20 63 68 61 72 20 73 71 6c 69 74 65  atic char sqlite
7060: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
7070: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
7080: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 75   int nType){.  u
7090: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
70a0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
70b0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
70c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
70d0: 20 2a 7a 49 6e 20 3d 20 7a 54 79 70 65 3b 0a 20   *zIn = zType;. 
70e0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
70f0: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 28 7a 49  char *zEnd = (zI
7100: 6e 2b 6e 54 79 70 65 29 3b 0a 0a 20 20 77 68 69  n+nType);..  whi
7110: 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b  le( zIn!=zEnd ){
7120: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20  .    h = (h<<8) 
7130: 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  + sqlite3UpperTo
7140: 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20  Lower[*zIn];.   
7150: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
7160: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
7170: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
7180: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
7190: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
71a0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
71b0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20  TE_AFF_TEXT; .  
71c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
71d0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
71e0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
71f0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
7200: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
7210: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7220: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
7230: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
7240: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
7250: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
7260: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
7270: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7280: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
7290: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
72a0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
72b0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
72c0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
72d0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
72e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
72f0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
7300: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7310: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
7320: 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d   (h&0x00FFFFFF)=
7330: 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27  =(('i'<<16)+('n'
7340: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
7350: 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20  /* INT */.      
7360: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7370: 5f 49 4e 54 45 47 45 52 3b 20 0a 20 20 20 20 20  _INTEGER; .     
7380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7390: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  }..  return aff;
73a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
73b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
73c0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
73d0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
73e0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
73f0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7400: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
7410: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
7420: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
7430: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
7440: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
7450: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
7460: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
7470: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
7480: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
7490: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
74a0: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
74b0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
74c0: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
74d0: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
74e0: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
74f0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
7500: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
7510: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
7520: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
7530: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
7540: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
7550: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
7560: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7570: 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  pFirst, Token *p
7580: 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Last){.  Table *
7590: 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
75a0: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
75b0: 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  z;.  const unsig
75c0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 0a  ned char *zIn;..
75d0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
75e0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
75f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7600: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
7610: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
7620: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
7630: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
7640: 6c 5b 69 5d 3b 0a 20 20 7a 49 6e 20 3d 20 70 46  l[i];.  zIn = pF
7650: 69 72 73 74 2d 3e 7a 3b 0a 20 20 6e 20 3d 20 70  irst->z;.  n = p
7660: 4c 61 73 74 2d 3e 6e 20 2b 20 28 70 4c 61 73 74  Last->n + (pLast
7670: 2d 3e 7a 20 2d 20 7a 49 6e 29 3b 0a 20 20 61 73  ->z - zIn);.  as
7680: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70  sert( pCol->zTyp
7690: 65 3d 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70 43  e==0 );.  z = pC
76a0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
76b0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 6e 2b 31 29  teMallocRaw(n+1)
76c0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
76d0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a  eturn;.  for(i=j
76e0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
76f0: 20 20 20 69 6e 74 20 63 20 3d 20 7a 49 6e 5b 69     int c = zIn[i
7700: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  ];.    if( isspa
7710: 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65  ce(c) ) continue
7720: 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63  ;.    z[j++] = c
7730: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
7740: 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ;.  pCol->affini
7750: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
7760: 6e 69 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a  nityType(z, n);.
7770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
7780: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
7790: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
77a0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
77b0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
77c0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
77d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
77e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
77f0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
7800: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
7810: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
7820: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
7830: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
7840: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
7850: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7860: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7870: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7880: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7890: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
78a0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
78b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
78c0: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
78d0: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
78e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
78f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7900: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
7910: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
7920: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
7930: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
7940: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
7950: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 69 66 28 20  nCol-1]);.  if( 
7960: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
7970: 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
7980: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7990: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
79a0: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
79b0: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
79c0: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
79d0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
79e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
79f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7a00: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
7a10: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
7a20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7a30: 28 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73  (pExpr);.  }.  s
7a40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7a50: 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pExpr);.}../*.*
7a60: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
7a70: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
7a80: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
7a90: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
7aa0: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
7ab0: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
7ac0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
7ad0: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
7ae0: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
7af0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
7b00: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
7b10: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
7b20: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
7b30: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
7b40: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
7b50: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
7b60: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
7b70: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
7b80: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
7b90: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
7ba0: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
7bb0: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
7bc0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
7bd0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
7be0: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
7bf0: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
7c00: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
7c10: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
7c20: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
7c30: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
7c40: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
7c50: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
7c60: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
7c70: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
7c80: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
7c90: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
7ca0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
7cb0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
7cc0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
7cd0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
7ce0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
7cf0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
7d00: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
7d10: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
7d20: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
7d30: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
7d40: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
7d50: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
7d60: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
7d70: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
7d80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7d90: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
7da0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7db0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7dc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7dd0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
7de0: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
7df0: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
7e00: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
7e10: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
7e20: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
7e30: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
7e40: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
7e50: 6e 63 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc       /* True
7e60: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
7e70: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
7e80: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20   present */.){. 
7e90: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
7ea0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7eb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
7ec0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
7ed0: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
7ee0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72  Tab==0 ) goto pr
7ef0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
7f00: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
7f10: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
7f20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7f30: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
7f40: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
7f50: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
7f60: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
7f70: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
7f80: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
7f90: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
7fa0: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
7fb0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
7fc0: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
7fd0: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
7fe0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7ff0: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
8000: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
8010: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
8020: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8030: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
8040: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
8050: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
8060: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
8070: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
8080: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
8090: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
80a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
80b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
80c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
80d0: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
80e0: 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l ) pTab->aCol[i
80f0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
8100: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
8110: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
8120: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
8130: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
8140: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
8150: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
8160: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
8170: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
8180: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
8190: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
81a0: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
81b0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
81c0: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
81d0: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
81e0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61  onError;.    pTa
81f0: 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74  b->autoInc = aut
8200: 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oInc;.  }else if
8210: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
8220: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8230: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
8240: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8250: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
8260: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
8270: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
8280: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
8290: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
82a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
82b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
82c0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
82d0: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
82e0: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a  onError, 0, 0);.
82f0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
8300: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
8310: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
8320: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
8330: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
8340: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
8350: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
8360: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
8370: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
8380: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
8390: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
83a0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
83b0: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
83c0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
83d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
83e0: 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29  Type, int nType)
83f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8400: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 43  Index *pIdx;.  C
8410: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
8420: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28   int i;..  if( (
8430: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8440: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
8450: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
8460: 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  l-1;..  pColl = 
8470: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
8480: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79  lSeq(pParse, zTy
8490: 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d  pe, nType);.  p-
84a0: 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d  >aCol[i].pColl =
84b0: 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66   pColl;..  /* If
84c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
84d0: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
84e0: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
84f0: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
8500: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
8510: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
8520: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
8530: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
8540: 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  he.  ** collatio
8550: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
8560: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
8570: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
8580: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
8590: 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70  x = p->pIndex; p
85a0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
85b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65  pNext){.    asse
85c0: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
85d0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  n==1 );.    if( 
85e0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
85f0: 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65 79  ]==i ) pIdx->key
8600: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
8610: 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pColl;.  }.}../*
8620: 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20 72  .** Locate and r
8630: 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20 66  eturn an entry f
8640: 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c  rom the db.aColl
8650: 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Seq hash table. 
8660: 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20  If the entry.** 
8670: 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e 61  specified by zNa
8680: 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20  me and nName is 
8690: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70 61  not found and pa
86a0: 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65 27  rameter 'create'
86b0: 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
86c0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
86d0: 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 20  ntry. Otherwise 
86e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
86f0: 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20  ** Each pointer 
8700: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71  stored in the sq
8710: 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68  lite3.aCollSeq h
8720: 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ash table contai
8730: 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f  ns an.** array o
8740: 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65 71 20  f three CollSeq 
8750: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
8760: 66 69 72 73 74 20 69 73 20 74 68 65 20 63 6f 6c  first is the col
8770: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a  lation sequence.
8780: 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20 66 6f  ** prefferred fo
8790: 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73 65 63  r UTF-8, the sec
87a0: 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e  ond UTF-16le, an
87b0: 64 20 74 68 65 20 74 68 69 72 64 20 55 54 46 2d  d the third UTF-
87c0: 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  16be..**.** Stor
87d0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
87e0: 66 74 65 72 20 74 68 65 20 74 68 72 65 65 20 63  fter the three c
87f0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8800: 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66 0a  es is a copy of.
8810: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** the collation
8820: 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20   sequence name. 
8830: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  A pointer to thi
8840: 73 20 73 74 72 69 6e 67 20 69 73 20 73 74 6f 72  s string is stor
8850: 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f  ed in.** each co
8860: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8870: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
8880: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20  tatic CollSeq * 
8890: 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79  findCollSeqEntry
88a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
88b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
88c0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
88d0: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
88e0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
88f0: 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  oll;.  if( nName
8900: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
8910: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43  len(zName);.  pC
8920: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
8930: 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
8940: 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
8950: 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43  e);..  if( 0==pC
8960: 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b  oll && create ){
8970: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
8980: 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a  iteMalloc( 3*siz
8990: 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e  eof(*pColl) + nN
89a0: 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ame + 1 );.    i
89b0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
89c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 44 65 6c 20    CollSeq *pDel 
89d0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  = 0;.      pColl
89e0: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [0].zName = (cha
89f0: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
8a00: 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63      pColl[0].enc
8a10: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
8a20: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a        pColl[1].z
8a30: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
8a40: 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70  Coll[3];.      p
8a50: 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51  Coll[1].enc = SQ
8a60: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20  LITE_UTF16LE;.  
8a70: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61      pColl[2].zNa
8a80: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  me = (char*)&pCo
8a90: 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f  ll[3];.      pCo
8aa0: 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49  ll[2].enc = SQLI
8ab0: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20  TE_UTF16BE;.    
8ac0: 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30    memcpy(pColl[0
8ad0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ].zName, zName, 
8ae0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  nName);.      pC
8af0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61  oll[0].zName[nNa
8b00: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  me] = 0;.      p
8b10: 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Del = sqlite3Has
8b20: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f  hInsert(&db->aCo
8b30: 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e  llSeq, pColl[0].
8b40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43  zName, nName, pC
8b50: 6f 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  oll);..      /* 
8b60: 49 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  If a malloc() fa
8b70: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 69 6e  ilure occured in
8b80: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
8b90: 72 74 28 29 2c 20 69 74 20 77 69 6c 6c 20 0a 20  rt(), it will . 
8ba0: 20 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74       ** return t
8bb0: 68 65 20 70 43 6f 6c 6c 20 70 6f 69 6e 74 65 72  he pColl pointer
8bc0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 28   to be deleted (
8bd0: 62 65 63 61 75 73 65 20 69 74 20 77 61 73 6e 27  because it wasn'
8be0: 74 20 61 64 64 65 64 0a 20 20 20 20 20 20 2a 2a  t added.      **
8bf0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
8c00: 6c 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  le)..      */.  
8c10: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 44 65      assert( !pDe
8c20: 6c 20 7c 7c 20 28 73 71 6c 69 74 65 33 5f 6d 61  l || (sqlite3_ma
8c30: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 26 26 20 70  lloc_failed && p
8c40: 44 65 6c 3d 3d 70 43 6f 6c 6c 29 20 29 3b 0a 20  Del==pColl) );. 
8c50: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
8c60: 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pDel);.    }.  }
8c70: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
8c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
8c90: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
8ca0: 20 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   to a UTF-8 enco
8cb0: 64 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65  ded string nName
8cc0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20   bytes long..** 
8cd0: 52 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53  Return the CollS
8ce0: 65 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  eq* pointer for 
8cf0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8d00: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61  quence named zNa
8d10: 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  me.** for the en
8d20: 63 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f  coding 'enc' fro
8d30: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27  m the database '
8d40: 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  db'..**.** If th
8d50: 65 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65  e entry specifie
8d60: 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61  d is not found a
8d70: 6e 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74  nd 'create' is t
8d80: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
8d90: 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e   a.** new entry.
8da0: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
8db0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c  rn NULL..*/.Coll
8dc0: 53 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  Seq *sqlite3Find
8dd0: 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74  CollSeq(.  sqlit
8de0: 65 33 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63  e3 *db,.  u8 enc
8df0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
8e00: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61  zName,.  int nNa
8e10: 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65  me,.  int create
8e20: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
8e30: 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53  Coll = findCollS
8e40: 65 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d  eqEntry(db, zNam
8e50: 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65  e, nName, create
8e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
8e70: 49 54 45 5f 55 54 46 38 3d 3d 31 20 26 26 20 53  ITE_UTF8==1 && S
8e80: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32  QLITE_UTF16LE==2
8e90: 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36   && SQLITE_UTF16
8ea0: 42 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72  BE==3 );.  asser
8eb0: 74 28 20 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55  t( enc>=SQLITE_U
8ec0: 54 46 38 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49  TF8 && enc<=SQLI
8ed0: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
8ee0: 69 66 28 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  if( pColl ) pCol
8ef0: 6c 20 2b 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65  l += enc-1;.  re
8f00: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
8f10: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
8f20: 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65  'collation neede
8f30: 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72  d' callback to r
8f40: 65 71 75 65 73 74 20 61 20 63 6f 6c 6c 61 74 69  equest a collati
8f50: 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69  on sequence.** i
8f60: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
8f70: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  ext encoding of 
8f80: 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  name zName, leng
8f90: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20  th nName..** If 
8fa0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8fb0: 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63  quence.*/.static
8fc0: 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65   void callCollNe
8fd0: 65 64 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  eded(sqlite3 *db
8fe0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
8ff0: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
9000: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
9010: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21  xCollNeeded || !
9020: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
9030: 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  6 );.  if( nName
9040: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
9050: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  len(zName);.  if
9060: 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65  ( db->xCollNeede
9070: 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  d ){.    char *z
9080: 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74  External = sqlit
9090: 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20  eStrNDup(zName, 
90a0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
90b0: 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74  !zExternal ) ret
90c0: 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f  urn;.    db->xCo
90d0: 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70 43 6f  llNeeded(db->pCo
90e0: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c  llNeededArg, db,
90f0: 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a   (int)db->enc, z
9100: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73  External);.    s
9110: 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74 65 72  qliteFree(zExter
9120: 6e 61 6c 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  nal);.  }.#ifnde
9130: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
9140: 46 31 36 0a 20 20 69 66 28 20 64 62 2d 3e 78 43  F16.  if( db->xC
9150: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 7b 0a 20  ollNeeded16 ){. 
9160: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
9170: 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20 20 73 71  External;.    sq
9180: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d  lite3_value *pTm
9190: 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 72  p = sqlite3GetTr
91a0: 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 64 62 29  ansientValue(db)
91b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
91c0: 75 65 53 65 74 53 74 72 28 70 54 6d 70 2c 20 2d  ueSetStr(pTmp, -
91d0: 31 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  1, zName, SQLITE
91e0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
91f0: 41 54 49 43 29 3b 0a 20 20 20 20 7a 45 78 74 65  ATIC);.    zExte
9200: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  rnal = sqlite3Va
9210: 6c 75 65 54 65 78 74 28 70 54 6d 70 2c 20 53 51  lueText(pTmp, SQ
9220: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
9230: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74  );.    if( !zExt
9240: 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a  ernal ) return;.
9250: 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65      db->xCollNee
9260: 64 65 64 31 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e  ded16(db->pCollN
9270: 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69  eededArg, db, (i
9280: 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74  nt)db->enc, zExt
9290: 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  ernal);.  }.#end
92a0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
92b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
92c0: 65 64 20 69 66 20 74 68 65 20 63 6f 6c 6c 61 74  ed if the collat
92d0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 66 61 69 6c  ion factory fail
92e0: 73 20 74 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a  s to deliver a.*
92f0: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  * collation func
9300: 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 65 73 74  tion in the best
9310: 20 65 6e 63 6f 64 69 6e 67 20 62 75 74 20 74 68   encoding but th
9320: 65 72 65 20 6d 61 79 20 62 65 20 6f 74 68 65 72  ere may be other
9330: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
9340: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66  this collation f
9350: 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68  unction (for oth
9360: 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  er text encoding
9370: 73 29 20 61 76 61 69 6c 61 62 6c 65 2e 20 55 73  s) available. Us
9380: 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73  e one.** of thes
9390: 65 20 69 6e 73 74 65 61 64 20 69 66 20 74 68 65  e instead if the
93a0: 79 20 65 78 69 73 74 2e 20 41 76 6f 69 64 20 61  y exist. Avoid a
93b0: 20 55 54 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31   UTF-8 <-> UTF-1
93c0: 36 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a  6 conversion if.
93d0: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a  ** possible..*/.
93e0: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 74 68  static int synth
93f0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
9400: 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a  Parse, CollSeq *
9410: 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65  pColl){.  CollSe
9420: 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61  q *pColl2;.  cha
9430: 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e  r *z = pColl->zN
9440: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73  ame;.  int n = s
9450: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69  trlen(z);.  sqli
9460: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9470: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
9480: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
9490: 20 61 45 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c 49   aEnc[] = { SQLI
94a0: 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49  TE_UTF16BE, SQLI
94b0: 54 45 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c 49  TE_UTF16LE, SQLI
94c0: 54 45 5f 55 54 46 38 20 7d 3b 0a 20 20 66 6f 72  TE_UTF8 };.  for
94d0: 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b  (i=0; i<3; i++){
94e0: 0a 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71  .    pColl2 = sq
94f0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
9500: 28 64 62 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c  (db, aEnc[i], z,
9510: 20 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   n, 0);.    if( 
9520: 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30 20  pColl2->xCmp!=0 
9530: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
9540: 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73  pColl, pColl2, s
9550: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b  izeof(CollSeq));
9560: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9570: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
9580: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
9590: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
95a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
95b0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
95c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
95d0: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a  nce: %.*s", n, z
95e0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  );.  }.  pParse-
95f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72  >nErr++;.  retur
9600: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9610: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9620: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9630: 6f 6e 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  on a collation s
9640: 65 71 75 65 6e 63 65 20 62 65 66 6f 72 65 20 69  equence before i
9650: 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
9660: 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  check that it is
9670: 20 64 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64   defined. An und
9680: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  efined collation
9690: 20 73 65 71 75 65 6e 63 65 20 65 78 69 73 74 73   sequence exists
96a0: 20 77 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62   when.** a datab
96b0: 61 73 65 20 69 73 20 6c 6f 61 64 65 64 20 74 68  ase is loaded th
96c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65  at contains refe
96d0: 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74  rences to collat
96e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a  ion sequences.**
96f0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20 62   that have not b
9700: 65 65 6e 20 64 65 66 69 6e 65 64 20 62 79 20 73  een defined by s
9710: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
9720: 6c 6c 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a  llation() etc..*
9730: 2a 0a 2a 2a 20 49 66 20 72 65 71 75 69 72 65 64  *.** If required
9740: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
9750: 61 6c 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61 74  alls the 'collat
9760: 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c  ion needed' call
9770: 62 61 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65  back to.** reque
9780: 73 74 20 61 20 64 65 66 69 6e 69 74 69 6f 6e 20  st a definition 
9790: 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  of the collating
97a0: 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 74 68   sequence. If th
97b0: 69 73 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c  is doesn't work,
97c0: 20 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c 65   .** an equivale
97d0: 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nt collating seq
97e0: 75 65 6e 63 65 20 74 68 61 74 20 75 73 65 73 20  uence that uses 
97f0: 61 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  a text encoding 
9800: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
9810: 6d 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  m the main datab
9820: 61 73 65 20 69 73 20 73 75 62 73 74 69 74 75 74  ase is substitut
9830: 65 64 2c 20 69 66 20 6f 6e 65 20 69 73 20 61 76  ed, if one is av
9840: 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ailable..*/.int 
9850: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
9860: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
9870: 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  e, CollSeq *pCol
9880: 6c 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  l){.  if( pColl 
9890: 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  && !pColl->xCmp 
98a0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c  ){.    /* No col
98b0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
98c0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f 72  of this type for
98d0: 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69   this encoding i
98e0: 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20  s registered..  
98f0: 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f    ** Call the co
9900: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9910: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
9920: 20 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20   supply us with 
9930: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
9940: 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70  callCollNeeded(p
9950: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c  Parse->db, pColl
9960: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
9970: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
9980: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e      if( !pColl->
9990: 78 43 6d 70 20 26 26 20 73 79 6e 74 68 43 6f 6c  xCmp && synthCol
99a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
99b0: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
99c0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
99d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
99e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
99f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
9a00: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
9a10: 71 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c  q() for all coll
9a20: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
9a30: 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20  in an index,.** 
9a40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69  in order to veri
9a50: 66 79 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  fy that all the 
9a60: 6e 65 63 65 73 73 61 72 79 20 63 6f 6c 6c 61 74  necessary collat
9a70: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72  ing sequences ar
9a80: 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a  e.** loaded..*/.
9a90: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
9aa0: 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72  IndexCollSeq(Par
9ab0: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
9ac0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20  x *pIdx){.  if( 
9ad0: 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  pIdx ){.    int 
9ae0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
9af0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
9b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9b10: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
9b20: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64  lSeq(pParse, pId
9b30: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
9b40: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
9b50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
9b60: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
9b70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9b80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9b90: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9ba0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
9bb0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9bc0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
9bd0: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
9be0: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
9bf0: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
9c00: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
9c10: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
9c20: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
9c30: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
9c40: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
9c50: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
9c60: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
9c70: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
9c80: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
9c90: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
9ca0: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
9cb0: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
9cc0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
9cd0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
9ce0: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
9cf0: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
9d00: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
9d10: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
9d20: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
9d30: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
9d40: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
9d50: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
9d60: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
9d70: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
9d80: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
9d90: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
9da0: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
9db0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
9dc0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
9dd0: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
9de0: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
9df0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
9e00: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
9e10: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
9e20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
9e30: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
9e40: 0a 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72  .  u8 enc = pPar
9e50: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75  se->db->enc;.  u
9e60: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 70 50 61  8 initbusy = pPa
9e70: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
9e80: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
9e90: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
9ea0: 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ndCollSeq(pParse
9eb0: 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  ->db, enc, zName
9ec0: 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , nName, initbus
9ed0: 79 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c  y);.  if( nName<
9ee0: 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  0 ) nName = strl
9ef0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(zName);.  if(
9f00: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9f10: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9f20: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a  >xCmp) ){.    /*
9f30: 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   No collation se
9f40: 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74  quence of this t
9f50: 79 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63  ype for this enc
9f60: 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65  oding is registe
9f70: 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c  red..    ** Call
9f80: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9f90: 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66  actory to see if
9fa0: 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75   it can supply u
9fb0: 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20  s with one..    
9fc0: 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e  */.    callCollN
9fd0: 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62  eeded(pParse->db
9fe0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
9ff0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
a000: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
a010: 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c  pParse->db, enc,
a020: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30   zName, nName, 0
a030: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
a040: 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   && !pColl->xCmp
a050: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
a060: 72 65 20 6d 61 79 20 62 65 20 61 20 76 65 72 73  re may be a vers
a070: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ion of the colla
a080: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
a090: 61 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  at requires.    
a0a0: 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e    ** translation
a0b0: 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e   between encodin
a0c0: 67 73 2e 20 53 65 61 72 63 68 20 66 6f 72 20 69  gs. Search for i
a0d0: 74 20 77 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c  t with synthColl
a0e0: 53 65 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  Seq()..      */.
a0f0: 20 20 20 20 20 20 69 66 28 20 73 79 6e 74 68 43        if( synthC
a100: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a110: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
a120: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
a130: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a140: 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20 68 61  /* If nothing ha
a150: 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72  s been found, wr
a160: 69 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ite the error me
a170: 73 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73  ssage into pPars
a180: 65 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69 74  e */.  if( !init
a190: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
a1a0: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
a1b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
a1c0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
a1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a1e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
a1f0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
a200: 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c  sequence: %.*s",
a210: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a   nName, zName);.
a220: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
a230: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a240: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
a250: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a260: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
a270: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
a280: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
a290: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
a2a0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a2b0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
a2c0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
a2d0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
a2e0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
a2f0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
a300: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
a310: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
a320: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
a330: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
a340: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
a350: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
a360: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
a370: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
a380: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
a390: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
a3a0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
a3b0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
a3c0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
a3d0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
a3e0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
a3f0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
a400: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
a410: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
a420: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
a430: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
a440: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
a450: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
a460: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
a470: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
a480: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
a490: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
a4a0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
a4b0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
a4c0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
a4d0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
a4e0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
a4f0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
a500: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
a510: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
a520: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
a530: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a  Cookie(sqlite3 *
a540: 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74  db, Vdbe *v, int
a550: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
a560: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a570: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
a580: 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  [iDb].schema_coo
a590: 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  kie+1, 0);.  sql
a5a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a5b0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a5c0: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Db, 0);.}../*.**
a5d0: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
a5e0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
a5f0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
a600: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
a610: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
a620: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
a630: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
a640: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
a650: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
a660: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
a670: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
a680: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
a690: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
a6a0: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
a6b0: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
a6c0: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
a6d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
a6e0: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
a6f0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
a700: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
a710: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
a720: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
a730: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
a740: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
a750: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
a760: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
a770: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
a780: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
a790: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
a7a0: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
a7b0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
a7c0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
a7d0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
a7e0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
a7f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
a800: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
a810: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
a820: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
a830: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
a840: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
a850: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
a860: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
a870: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
a880: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
a890: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
a8a0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
a8b0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
a8c0: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
a8d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
a8e0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
a8f0: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
a900: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
a910: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
a920: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
a930: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a940: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
a950: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
a960: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
a970: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
a980: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
a990: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
a9a0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
a9b0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
a9c0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
a9d0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
a9e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
a9f0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
aa00: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
aa10: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
aa20: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
aa30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
aa40: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
aa50: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
aa60: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
aa70: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
aa80: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
aa90: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
aaa0: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
aab0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
aac0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
aad0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
aae0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
aaf0: 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  , *z;.  Column *
ab00: 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  pCol;.  n = 0;. 
ab10: 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61   for(pCol = p->a
ab20: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
ab30: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ab40: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
ab50: 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e  tLength(pCol->zN
ab60: 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43  ame);.    z = pC
ab70: 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69  ol->zType;.    i
ab80: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20  f( z ){.      n 
ab90: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20  += (strlen(z) + 
aba0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
abb0: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
abc0: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
abd0: 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<50 ){.    zS
abe0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
abf0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
ac00: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
ac10: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
ac20: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
ac30: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
ac40: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
ac50: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
ac60: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
ac70: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
ac80: 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  w( n );.  if( zS
ac90: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
aca0: 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  0;.  strcpy(zStm
acb0: 74 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26  t, !OMIT_TEMPDB&
acc0: 26 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52  &p->iDb==1 ? "CR
acd0: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
ace0: 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  ":"CREATE TABLE 
acf0: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
ad00: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
ad10: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
ad20: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
ad30: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
ad40: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
ad50: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
ad60: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ad70: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
ad80: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
ad90: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
ada0: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
adb0: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
adc0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
add0: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
ade0: 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43  .    if( (z = pC
adf0: 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b  ol->zType)!=0 ){
ae00: 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b  .      zStmt[k++
ae10: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73  ] = ' ';.      s
ae20: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
ae30: 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20   z);.      k += 
ae40: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d  strlen(z);.    }
ae50: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
ae60: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
ae70: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
ae80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ae90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
aea0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
aeb0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
aec0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
aed0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
aee0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
aef0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
af00: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
af10: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
af20: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
af30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
af40: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
af50: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
af60: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
af70: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
af80: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
af90: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
afa0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
afb0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
afc0: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
afd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
afe0: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
aff0: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
b000: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
b010: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
b020: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
b030: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b040: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
b050: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
b060: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
b070: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
b080: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b090: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
b0a0: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
b0b0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
b0c0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
b0d0: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
b0e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b0f0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
b100: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
b110: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
b120: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
b130: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
b140: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b150: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
b160: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
b170: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
b180: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
b190: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
b1a0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
b1b0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
b1c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
b1d0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
b1e0: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
b1f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
b200: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
b210: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
b220: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
b230: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b240: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
b250: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
b260: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
b270: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
b280: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
b290: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
b2a0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
b2b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
b2c0: 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69  inal ')' token i
b2d0: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
b2e0: 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  LE */.  Select *
b2f0: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
b300: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
b310: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
b320: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
b330: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
b340: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b350: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
b360: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
b370: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
b380: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
b390: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
b3a0: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
b3b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
b3c0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b3d0: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
b3e0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
b3f0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
b400: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
b410: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
b420: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
b430: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
b440: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
b450: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
b460: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
b470: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
b480: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
b490: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
b4a0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
b4b0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
b4c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b4d0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
b4e0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
b4f0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
b500: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
b510: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
b520: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
b530: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
b540: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
b550: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
b560: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
b570: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
b580: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
b590: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
b5a0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
b5b0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
b5c0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b5d0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
b5e0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
b5f0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
b600: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
b610: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b620: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
b630: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
b640: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
b650: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
b660: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
b670: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
b680: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
b690: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
b6a0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
b6b0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
b6c0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
b6d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
b6e0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
b6f0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
b700: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
b710: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
b720: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
b730: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
b740: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
b750: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
b760: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
b770: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
b780: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
b790: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
b7a0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
b7b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b7c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
b7d0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
b7e0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
b7f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
b800: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  ose, 0, 0);..   
b810: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
b820: 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
b830: 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75  new table and pu
b840: 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73  sh it onto the s
b850: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76  tack..    ** A v
b860: 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70  iew has no rootp
b870: 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73  age, so just pus
b880: 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68  h a zero onto th
b890: 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20  e stack for.    
b8a0: 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69  ** views.  Initi
b8b0: 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74  alize zType at t
b8c0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
b8d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
b8e0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
b8f0: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
b900: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
b910: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  /* sqlite3VdbeAd
b920: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
b930: 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30  Table, p->iDb, 0
b940: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ); */.      zTyp
b950: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
b960: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
b970: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
b980: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
b990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
b9a0: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
b9b0: 2f 2a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /*  sqlite3VdbeA
b9c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
b9d0: 65 72 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a 20 20  er, 0, 0); */.  
b9e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
b9f0: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
ba00: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
ba10: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
ba20: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
ba30: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
ba40: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
ba50: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
ba60: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
ba70: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
ba80: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
ba90: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
baa0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
bab0: 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74  ew table is on t
bac0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64  he top of the vd
bad0: 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  be stack..    **
bae0: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
baf0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
bb00: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
bb10: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
bb20: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
bb30: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
bb40: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
bb50: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
bb60: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
bb70: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
bb80: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
bb90: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
bba0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
bbb0: 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71  SelTab;.      sq
bbc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bbd0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
bbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bbf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
bc00: 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30  teger, p->iDb, 0
bc10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bc20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bc30: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29  OpenWrite, 1, 0)
bc40: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
bc50: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
bc60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
bc70: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53  arse, pSelect, S
bc80: 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20  RT_Table, 1, 0, 
bc90: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
bca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bcb0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
bcc0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
bcd0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
bce0: 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  {.        pSelTa
bcf0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
bd00: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
bd10: 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29  rse, 0, pSelect)
bd20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
bd30: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
bd40: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
bd50: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
bd60: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  .        p->nCol
bd70: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
bd80: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  ;.        p->aCo
bd90: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
bda0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
bdb0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
bdc0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
bdd0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
bde0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
bdf0: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
be00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
be10: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
be20: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
be30: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
be40: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
be50: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
be60: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
be70: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b  ateTableStmt(p);
be80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
be90: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
bea0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
beb0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
bec0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d   + 1;.      zStm
bed0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
bee0: 74 66 28 22 43 52 45 41 54 45 20 25 73 20 25 2e  tf("CREATE %s %.
bef0: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
bf00: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
bf10: 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  en.z);.    }..  
bf20: 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
bf30: 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
bf40: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
bf50: 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
bf60: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
bf70: 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
bf80: 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
bf90: 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
bfa0: 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
bfb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
bfc0: 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68  e collected.  Th
bfd0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
bfe0: 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  preallocated.   
bff0: 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20   ** slot is the 
c000: 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  2nd item on the 
c010: 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20  stack.  The top 
c020: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20  of the stack is 
c030: 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
c040: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
c050: 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69   table (or a 0 i
c060: 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77  f this is a view
c070: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
c080: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
c090: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
c0a0: 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20  UPDATE %Q.%s ". 
c0b0: 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70          "SET typ
c0c0: 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c  e='%s', name=%Q,
c0d0: 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f   tbl_name=%Q, ro
c0e0: 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25  otpage=#0, sql=%
c0f0: 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
c100: 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20  E rowid=#1",.   
c110: 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44     db->aDb[p->iD
c120: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
c130: 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a  _TABLE(p->iDb),.
c140: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
c150: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
c160: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
c170: 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
c180: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c190: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
c1a0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
c1b0: 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a  b, v, p->iDb);..
c1c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c1d0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
c1e0: 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
c1f0: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
c200: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
c210: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
c220: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
c230: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
c240: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
c250: 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
c260: 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  f( p->autoInc ){
c270: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
c280: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
c290: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ];.      if( pDb
c2a0: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
c2b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
c2c0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c2d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
c2e0: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
c2f0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
c300: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
c310: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
c320: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
c330: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
c340: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
c350: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
c360: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
c370: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
c380: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
c390: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
c3a0: 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62  seSchema, p->iDb
c3b0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
c3c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c  ite3MPrintf("tbl
c3d0: 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a  _name='%q'",p->z
c3e0: 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49  Name), P3_DYNAMI
c3f0: 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  C);.  }...  /* A
c400: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
c410: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
c420: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
c430: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
c440: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
c450: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
c460: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
c470: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
c480: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a    FKey *pFKey; .
c490: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
c4a0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a  b->aDb[p->iDb];.
c4b0: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
c4c0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
c4d0: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
c4e0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
c4f0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
c500: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
c510: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
c520: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
c530: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
c540: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
c550: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
c560: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69  return;.    }.#i
c570: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c580: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
c590: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
c5a0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
c5b0: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
c5c0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
c5d0: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
c5e0: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
c5f0: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
c600: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
c610: 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79  Find(&pDb->aFKey
c620: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
c630: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
c640: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
c650: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
c660: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
c670: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c680: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
c690: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
c6a0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
c6b0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
c6c0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
c6d0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
c6e0: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
c6f0: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
c700: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
c710: 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
c720: 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
c730: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
c740: 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70 43 6f  Cons->z==0 ) pCo
c750: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
c760: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
c770: 20 3d 20 31 33 20 2b 20 28 70 43 6f 6e 73 2d 3e   = 13 + (pCons->
c780: 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
c790: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d  eToken.z);.    }
c7a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
c7b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c7c0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
c7d0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
c7e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
c7f0: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
c800: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
c810: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
c820: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
c830: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
c840: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
c850: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
c860: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
c870: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
c880: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
c890: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
c8a0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
c8b0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
c8c0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
c8d0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
c8e0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
c8f0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
c900: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
c910: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
c920: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c930: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
c940: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
c950: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
c960: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
c970: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20    int isTemp    
c980: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
c990: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
c9a0: 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  w */.){.  Table 
c9b0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
c9c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
c9d0: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
c9e0: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
c9f0: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
ca00: 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53  ame;..  sqlite3S
ca10: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
ca20: 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31  , pBegin, pName1
ca30: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
ca40: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
ca50: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ca60: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
ca70: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
ca80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ca90: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
caa0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
cab0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
cac0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
cad0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
cae0: 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
caf0: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
cb00: 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c   pParse, p->iDb,
cb10: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
cb20: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
cb30: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
cb40: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
cb50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
cb60: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
cb70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
cb80: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
cb90: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
cba0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
cbb0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
cbc0: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
cbd0: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
cbe0: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
cbf0: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
cc00: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
cc10: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
cc20: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
cc30: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
cc40: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
cc50: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
cc60: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
cc70: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
cc80: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
cc90: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
cca0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
ccb0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65  te3SelectDup(pSe
ccc0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
ccd0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
cce0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50  lect);.  if( !pP
ccf0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
cd00: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
cd10: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
cd20: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
cd30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
cd40: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
cd50: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
cd60: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
cd70: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
cd80: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
cd90: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
cda0: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
cdb0: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
cdc0: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
cdd0: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
cde0: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
cdf0: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
ce00: 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  = sEnd.z - pBegi
ce10: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  n->z;.  z = (con
ce20: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
ce30: 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  *)pBegin->z;.  w
ce40: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b  hile( n>0 && (z[
ce50: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73  n-1]==';' || iss
ce60: 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b  pace(z[n-1])) ){
ce70: 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
ce80: 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
ce90: 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
cea0: 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
ceb0: 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
cec0: 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
ced0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
cee0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
cef0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
cf00: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
cf10: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
cf20: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
cf30: 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EW */..#ifndef S
cf40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
cf50: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
cf60: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
cf70: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
cf80: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
cf90: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
cfa0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
cfb0: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
cfc0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
cfd0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
cfe0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
cff0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
d000: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
d010: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
d020: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
d030: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
d040: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
d050: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
d060: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
d070: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
d080: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
d090: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
d0a0: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
d0b0: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
d0c0: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
d0d0: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
d0e0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
d0f0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
d100: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
d110: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
d120: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
d130: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
d140: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
d150: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
d160: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
d170: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20  s assigned */.. 
d180: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
d190: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
d1a0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
d1b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
d1c0: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
d1d0: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
d1e0: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
d1f0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
d200: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d210: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
d220: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
d230: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
d240: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
d250: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
d260: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
d270: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
d280: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
d290: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
d2a0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
d2b0: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
d2c0: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
d2d0: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
d2e0: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
d2f0: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
d300: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
d310: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
d320: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
d330: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
d340: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
d350: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
d360: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
d370: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
d380: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
d390: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
d3a0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
d3b0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
d3c0: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
d3d0: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
d3e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
d3f0: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
d400: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d410: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
d420: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
d430: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
d440: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
d450: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
d460: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
d470: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
d480: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
d490: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
d4a0: 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
d4b0: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
d4c0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
d4d0: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
d4e0: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
d4f0: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
d500: 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
d510: 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
d520: 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
d530: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
d540: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
d550: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
d560: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
d570: 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
d580: 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
d590: 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
d5a0: 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
d5b0: 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
d5c0: 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
d5d0: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
d5e0: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
d5f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
d600: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
d610: 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
d620: 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d  electDup(pTable-
d630: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 20 3d  >pSelect);.  n =
d640: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
d650: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
d660: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
d670: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
d680: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
d690: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
d6a0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
d6b0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
d6c0: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
d6d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
d6e0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20  ;.  if( pSelTab 
d6f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d700: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
d710: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
d720: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
d730: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  ol;.    pTable->
d740: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
d750: 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61  aCol;.    pSelTa
d760: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
d770: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
d780: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
d790: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
d7a0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65  elTab);.    DbSe
d7b0: 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65  tProperty(pParse
d7c0: 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44  ->db, pTable->iD
d7d0: 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  b, DB_UnresetVie
d7e0: 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ws);.  }else{.  
d7f0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
d800: 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a   0;.    nErr++;.
d810: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
d820: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b  ectDelete(pSel);
d830: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
d840: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   .}.#endif /* SQ
d850: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
d860: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
d870: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
d880: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
d890: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
d8a0: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
d8b0: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
d8c0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
d8d0: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
d8e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
d8f0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
d900: 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
d910: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
d920: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
d930: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
d940: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
d950: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
d960: 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  .tblHash); i; i=
d970: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
d980: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
d990: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
d9a0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
d9b0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
d9c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65  {.      sqliteRe
d9d0: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
d9e0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
d9f0: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
da00: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
da10: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
da20: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
da30: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
da40: 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
da50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
da60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
da70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
da80: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
da90: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
daa0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
dab0: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
dac0: 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
dad0: 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
dae0: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
daf0: 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
db00: 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
db10: 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
db20: 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
db30: 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
db40: 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  To..*/.#ifndef S
db50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
db60: 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
db70: 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
db80: 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72  Db *pDb, int iFr
db90: 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
dba0: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
dbb0: 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  .  .  for(pElem=
dbc0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
dbd0: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  &pDb->tblHash); 
dbe0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
dbf0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
dc00: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
dc10: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
dc20: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
dc30: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
dc40: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
dc50: 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
dc60: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  o;.      return;
dc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
dc80: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
dc90: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69 64 78  hFirst(&pDb->idx
dca0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
dcb0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
dcc0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
dcd0: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
dce0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
dcf0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
dd00: 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
dd10: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
dd20: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
dd30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
dd40: 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a 7d  }.  assert(0);.}
dd50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
dd60: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
dd70: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
dd80: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
dd90: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
dda0: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
ddb0: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
ddc0: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
ddd0: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
dde0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
ddf0: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
de00: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
de10: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
de20: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
de30: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
de40: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
de50: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
de60: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
de70: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
de80: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
de90: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
dea0: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
deb0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
dec0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ded0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
dee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
def0: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
df00: 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a  , iTable, iDb);.
df10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
df20: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
df30: 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70   /* OP_Destroy p
df40: 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72  ushes an integer
df50: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
df60: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
df70: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
df80: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
df90: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
dfa0: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
dfb0: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
dfc0: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
dfd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
dfe0: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
dff0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e000: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
e010: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
e020: 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68 65   The "#0" in the
e030: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
e040: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
e050: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
e060: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20  alue.  ** is on 
e070: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
e080: 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74  tack.  See sqlit
e090: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
e0a0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
e0b0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
e0c0: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
e0d0: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
e0e0: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 30  page=%d WHERE #0
e0f0: 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30   AND rootpage=#0
e100: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
e110: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
e120: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
e130: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a  (iDb), iTable);.
e140: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e150: 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
e160: 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
e170: 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
e180: 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
e190: 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
e1a0: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
e1b0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e1c0: 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
e1d0: 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
e1e0: 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
e1f0: 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
e200: 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
e210: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
e220: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
e230: 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
e240: 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
e250: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
e260: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
e270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e280: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
e290: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
e2a0: 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
e2b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e2c0: 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
e2d0: 20 2a 70 49 64 78 3b 0a 20 20 64 65 73 74 72 6f   *pIdx;.  destro
e2e0: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
e2f0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54  , pTab->tnum, pT
e300: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28  ab->iDb);.  for(
e310: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e320: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e330: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e340: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e350: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
e360: 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a  um, pIdx->iDb);.
e370: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
e380: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
e390: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
e3a0: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
e3b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e3c0: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
e3d0: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
e3e0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
e3f0: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
e400: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
e410: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
e420: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
e430: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
e440: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
e450: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
e460: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
e470: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
e480: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
e490: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
e4a0: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
e4b0: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
e4c0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
e4d0: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
e4e0: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
e4f0: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
e500: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
e510: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
e520: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
e530: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
e540: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
e550: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
e560: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
e570: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
e580: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e590: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
e5a0: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
e5b0: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
e5c0: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
e5d0: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
e5e0: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
e5f0: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
e600: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
e610: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
e620: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
e630: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
e640: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
e650: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
e660: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
e670: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
e680: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
e690: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
e6a0: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
e6b0: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
e6c0: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
e6d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
e6e0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e6f0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e700: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e710: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
e720: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
e730: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 44 62  ssert( pIdx->iDb
e740: 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20  ==pTab->iDb );. 
e750: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
e760: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
e770: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
e780: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
e790: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
e7a0: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
e7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e7c0: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 20 72   iLargest==0 ) r
e7d0: 65 74 75 72 6e 3b 0a 20 20 20 20 64 65 73 74 72  eturn;.    destr
e7e0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
e7f0: 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 70 54 61  e, iLargest, pTa
e800: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 44 65  b->iDb);.    iDe
e810: 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65  stroyed = iLarge
e820: 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  st;.  }.#endif.}
e830: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e840: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
e850: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
e860: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
e870: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
e880: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
e890: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
e8a0: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
e8b0: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
e8c0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
e8d0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
e8e0: 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
e8f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
e900: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
e910: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e920: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
e930: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
e940: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
e950: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
e960: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e970: 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ble;.  assert( p
e980: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
e990: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
e9a0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
e9b0: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
e9c0: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
e9d0: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
e9e0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
e9f0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
ea00: 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70  table;.  iDb = p
ea10: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  Tab->iDb;.  asse
ea20: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
ea30: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66  b<db->nDb );.#if
ea40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ea50: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
ea60: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
ea70: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ea80: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
ea90: 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b  ABLE(pTab->iDb);
eaa0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
eab0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
eac0: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
ead0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
eae0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
eaf0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
eb00: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
eb10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
eb20: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
eb30: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
eb40: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
eb50: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
eb60: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
eb70: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
eb80: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
eb90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eba0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
ebb0: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
ebc0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
ebd0: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
ebe0: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
ebf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
ec00: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
ec10: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
ec20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ec30: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
ec40: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
ec50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ec60: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
ec70: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
ec80: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
ec90: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
eca0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
ecb0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
ecc0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
ecd0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
ece0: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
ecf0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
ed00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
ed10: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
ed20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
ed30: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
ed40: 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e  ly || pTab==db->
ed50: 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62  aDb[iDb].pSeqTab
ed60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ed70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ed80: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
ed90: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
eda0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
edb0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
edc0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
edd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ede0: 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
edf0: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
ee00: 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
ee10: 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
ee20: 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
ee30: 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
ee40: 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
ee50: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
ee60: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ee70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ee80: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
ee90: 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
eea0: 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
eeb0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
eec0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
eed0: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
eee0: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
eef0: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
ef00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ef10: 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
ef20: 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
ef30: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
ef40: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
ef50: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
ef60: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
ef70: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
ef80: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
ef90: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
efa0: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
efb0: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
efc0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
efd0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
efe0: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
eff0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 69 6e 74  Trigger;.    int
f000: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
f010: 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  ;.    Db *pDb = 
f020: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
f030: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
f040: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
f050: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
f060: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
f070: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
f080: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
f090: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
f0a0: 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
f0b0: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
f0c0: 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
f0d0: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
f0e0: 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
f0f0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
f100: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
f110: 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
f120: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
f130: 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  er;.    while( p
f140: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
f150: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
f160: 72 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70  r->iDb==iDb || p
f170: 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20  Trigger->iDb==1 
f180: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f190: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
f1a0: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c  Parse, pTrigger,
f1b0: 20 31 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67   1);.      pTrig
f1c0: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
f1d0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69  pNext;.    }..#i
f1e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f1f0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
f200: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
f210: 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
f220: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
f230: 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
f240: 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68  d with.    ** th
f250: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
f260: 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
f270: 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
f280: 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
f290: 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74      ** at the bt
f2a0: 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
f2b0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
f2c0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
f2d0: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76  ds to.    ** mov
f2e0: 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
f2f0: 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
f300: 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
f310: 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20  cuum mode)..    
f320: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
f330: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
f340: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
f350: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
f360: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
f370: 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %s.sqlite_sequ
f380: 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
f390: 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  %Q",.        pDb
f3a0: 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
f3b0: 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
f3c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
f3d0: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
f3e0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
f3f0: 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
f400: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
f410: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
f420: 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
f430: 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
f440: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
f450: 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
f460: 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
f470: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
f480: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
f490: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
f4a0: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
f4b0: 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
f4c0: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
f4d0: 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
f4e0: 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
f4f0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
f500: 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
f510: 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
f520: 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
f530: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
f540: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
f550: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
f560: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
f570: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
f580: 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
f590: 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
f5a0: 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
f5b0: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
f5c0: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
f5d0: 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
f5e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
f5f0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
f600: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
f610: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
f620: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
f630: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
f640: 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
f650: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
f660: 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
f670: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
f680: 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ie..    */.    s
f690: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
f6a0: 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
f6b0: 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  Db, 0, pTab->zNa
f6c0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
f6d0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
f6e0: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d  db, v, iDb);.  }
f6f0: 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
f700: 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
f710: 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
f720: 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
f730: 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
f740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
f750: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f760: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
f770: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
f780: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
f790: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
f7a0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
f7b0: 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
f7c0: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
f7d0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
f7e0: 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
f7f0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
f800: 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
f810: 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
f820: 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
f830: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
f840: 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
f850: 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
f860: 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
f870: 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
f880: 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
f890: 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
f8a0: 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
f8b0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
f8c0: 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
f8d0: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
f8e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
f8f0: 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
f900: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
f910: 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
f920: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
f930: 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
f940: 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
f950: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
f960: 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
f970: 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
f980: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
f990: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
f9a0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
f9b0: 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
f9c0: 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20  ewTable field.  
f9d0: 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20  The new FKey.** 
f9e0: 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e  is not linked in
f9f0: 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20  to db->aFKey at 
fa00: 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61  this point - tha
fa10: 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  t does not happe
fa20: 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74  n.** until sqlit
fa30: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a  e3EndTable()..**
fa40: 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
fa50: 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
fa60: 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
fa70: 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
fa80: 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
fa90: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
faa0: 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
fab0: 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
fac0: 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
fad0: 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
fae0: 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
faf0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
fb00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
fb10: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
fb20: 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
fb30: 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
fb40: 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
fb50: 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
fb60: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
fb70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
fb80: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
fb90: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
fba0: 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
fbb0: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
fbc0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
fbd0: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
fbe0: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
fbf0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
fc00: 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69  rithms. */.){.#i
fc10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc20: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
fc30: 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
fc40: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
fc50: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
fc60: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
fc70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
fc80: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
fc90: 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
fca0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
fcb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
fcc0: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
fcd0: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
fce0: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
fcf0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
fd00: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74  if( iCol<0 ) got
fd10: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
fd20: 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
fd30: 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
fd40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
fd50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
fd60: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
fd70: 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
fd80: 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
fd90: 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
fda0: 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
fdb0: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
fdc0: 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
fdd0: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
fde0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
fdf0: 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
fe00: 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
fe10: 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
fe20: 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
fe30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fe40: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
fe50: 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
fe60: 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
fe70: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
fe80: 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
fe90: 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
fea0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
feb0: 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
fec0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
fed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
fee0: 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
fef0: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
ff00: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
ff10: 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  y) + nCol*sizeof
ff20: 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
ff30: 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
ff40: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
ff50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
ff60: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
ff70: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
ff80: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
ff90: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
ffa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
ffb0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
ffc0: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  oc( nByte );.  i
ffd0: 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f  f( pFKey==0 ) go
ffe0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b  to fk_end;.  pFK
fff0: 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
10000 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
10010 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
10020 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
10030 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61  y[1];.  pFKey->a
10040 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43  Col = (struct sC
10050 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d  olMap*)z;.  z +=
10060 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
10070 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20  ColMap)*nCol;.  
10080 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
10090 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
100a0 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
100b0 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
100c0 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
100d0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
100e0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  = 0;.  pFKey->nC
100f0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
10100 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
10110 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
10120 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
10130 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
10140 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
10150 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10160 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
10170 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
10180 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
10190 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
101a0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
101b0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
101c0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
101d0 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
101e0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
101f0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
10200 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
10210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10220 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
10230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
10240 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
10250 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
10260 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
10270 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
10280 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
10290 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
102a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
102b0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
102c0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
102d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
102e0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
102f0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
10300 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
10310 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
10320 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
10330 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
10340 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
10350 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
10360 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
10370 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
10380 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
10390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
103a0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
103b0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
103c0 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73  leteConf = flags
103d0 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
103e0 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28  ->updateConf = (
103f0 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
10400 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  xff;.  pFKey->in
10410 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67  sertConf = (flag
10420 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
10430 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
10440 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
10450 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
10460 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
10470 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
10480 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
10490 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
104a0 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
104b0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
104c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
104d0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
104e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
104f0 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29  Delete(pFromCol)
10500 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
10510 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c  istDelete(pToCol
10520 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
10530 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10540 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
10550 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
10560 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
10570 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
10580 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
10590 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
105a0 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
105b0 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
105c0 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
105d0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
105e0 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
105f0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
10600 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
10610 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
10620 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
10630 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10640 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
10650 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
10660 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
10670 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
10680 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
10690 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
106a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
106b0 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
106c0 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
106d0 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
106e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
106f0 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
10700 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
10710 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
10720 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
10730 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64  red = isDeferred
10740 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10750 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10760 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
10770 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
10780 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
10790 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
107a0 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
107b0 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
107c0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
107d0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
107e0 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
107f0 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
10800 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
10810 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
10820 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
10830 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
10840 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
10850 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
10860 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70  e memory cell sp
10870 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
10880 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
10890 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
108a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
108b0 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
108c0 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
108d0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
108e0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
108f0 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
10900 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
10910 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
10920 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
10930 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
10940 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
10950 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
10960 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
10970 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
10980 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
10990 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
109a0 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
109b0 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
109c0 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
109d0 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
109e0 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
109f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
10a00 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
10a10 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
10a20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
10a30 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
10a40 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
10a50 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b+1;     /* Btre
10a60 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
10a70 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
10a80 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10aa0 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
10ab0 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
10ac0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
10ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
10ae0 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
10af0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b10 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
10b20 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
10b30 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
10b40 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e 69 71 75  */.  int isUniqu
10b50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10b60 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
10b70 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 2a  a unique index *
10b80 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10b90 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
10ba0 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
10bb0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
10bc0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
10bd0 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
10be0 65 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72  e, 0,.      pPar
10bf0 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 70 49 6e 64  se->db->aDb[pInd
10c00 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  ex->iDb].zName )
10c10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10c20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
10c30 20 45 6e 73 75 72 65 20 61 6c 6c 20 74 68 65 20   Ensure all the 
10c40 72 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69  required collati
10c50 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72 65  on sequences are
10c60 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73   available. This
10c70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  .  ** routine wi
10c80 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  ll invoke the co
10c90 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63  llation-needed c
10ca0 61 6c 6c 62 61 63 6b 20 69 66 20 6e 65 63 65 73  allback if neces
10cb0 73 61 72 79 20 28 61 6e 64 0a 20 20 2a 2a 20 69  sary (and.  ** i
10cc0 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 72  f one has been r
10cd0 65 67 69 73 74 65 72 65 64 29 2e 0a 20 20 2a 2f  egistered)..  */
10ce0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
10cf0 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28  eckIndexCollSeq(
10d00 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 20  pParse, pIndex) 
10d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
10d20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
10d30 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10d40 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10d50 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
10d60 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
10d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d80 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
10d90 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20  d, memRootPage, 
10da0 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30  0);.    tnum = 0
10db0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
10dc0 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
10dd0 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
10de0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10df0 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e 64  lear, tnum, pInd
10e00 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20  ex->iDb);.  }.  
10e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e20 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10e30 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29 3b  pIndex->iDb, 0);
10e40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  .  sqlite3VdbeOp
10e50 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
10e60 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20  e, iIdx, tnum,. 
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65     (char*)&pInde
10e90 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  x->keyInfo, P3_K
10ea0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
10eb0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10ec0 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
10ed0 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  >iDb, 0);.  sqli
10ee0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10ef0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
10f00 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  b, pTab->tnum);.
10f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10f20 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
10f30 6f 6c 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70 54  olumns, iTab, pT
10f40 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 61 64 64  ab->nCol);.  add
10f50 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
10f60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
10f70 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
10f80 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
10f90 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
10fa0 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 73 55 6e  x, iTab);.  isUn
10fb0 69 71 75 65 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  ique = pIndex->o
10fc0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
10fd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10fe0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74  dOp(v, OP_IdxPut
10ff0 2c 20 69 49 64 78 2c 20 69 73 55 6e 69 71 75 65  , iIdx, isUnique
11000 29 3b 0a 20 20 69 66 28 20 69 73 55 6e 69 71 75  );.  if( isUniqu
11010 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
11020 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
11030 2d 31 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  -1, "indexed col
11040 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
11050 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
11060 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11070 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
11080 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
11090 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
110a0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
110b0 64 72 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65  dr1, sqlite3Vdbe
110c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
110d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
110e0 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
110f0 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c   iTab, 0);.  sql
11100 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11110 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c   OP_Close, iIdx,
11120 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   0);.}../*.** Cr
11130 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
11140 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
11150 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
11160 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
11170 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
11180 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
11190 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
111a0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
111b0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
111c0 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
111d0 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
111e0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
111f0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
11200 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
11210 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
11220 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
11230 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
11240 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
11250 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
11260 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
11270 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
11280 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
11290 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
112a0 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
112b0 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
112c0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
112d0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
112e0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
112f0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
11300 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
11310 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
11320 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
11330 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
11340 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
11350 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
11360 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
11370 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
11380 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
11390 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
113a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
113b0 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
113c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
113d0 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
113e0 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
113f0 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
11400 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
11410 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
11420 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
11430 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
11440 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
11450 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
11460 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
11470 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
11480 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
11490 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
114a0 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
114b0 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
114c0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
114d0 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
114e0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
114f0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
11500 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
11510 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
11520 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
11530 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
11540 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
11550 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
11560 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
11570 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45   begins a CREATE
11580 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
11590 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
115a0 64 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d        /* The 
115b0 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
115c0 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
115d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
115e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
115f0 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 74   0;   /* Table t
11600 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
11610 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
11620 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65  = 0; /* The inde
11630 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
11640 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
11650 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
11660 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
11670 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
11680 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
11690 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
116a0 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a  ixer sFix;    /*
116b0 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
116c0 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
116d0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c   pTable */.  sql
116e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
116f0 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44  e->db;..  int iD
11700 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  b;          /* I
11710 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
11720 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
11730 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
11740 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
11750 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64  ; /* Unqualified
11760 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
11770 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
11780 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11790 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
117a0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
117b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
117c0 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  index;..  /*.  *
117d0 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
117e0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
117f0 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
11800 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
11810 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
11820 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20  TblName!=0 ){.. 
11830 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77     /* Use the tw
11840 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d  o-part index nam
11850 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
11860 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
11870 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f   ** to search fo
11880 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69  r the table. 'Fi
11890 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  x' the table nam
118a0 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20  e to this db.   
118b0 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69   ** before looki
118c0 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e  ng up the table.
118d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
118e0 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e  rt( pName1 && pN
118f0 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20  ame2 );.    iDb 
11900 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
11910 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
11920 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
11930 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
11940 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  b<0 ) goto exit_
11950 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23  create_index;..#
11960 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11970 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a  IT_TEMPDB.    /*
11980 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
11990 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
119a0 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
119b0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
119c0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
119d0 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
119e0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
119f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62  .    */.    pTab
11a00 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
11a10 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
11a20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69  pTblName);.    i
11a30 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
11a40 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
11a50 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d  b && pTab->iDb==
11a60 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d  1 ){.      iDb =
11a70 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
11a80 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
11a90 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
11aa0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
11ab0 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
11ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
11ad0 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
11ae0 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
11af0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11b00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11b10 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
11b20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
11b30 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c  ble(pParse, pTbl
11b40 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
11b50 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
11b60 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
11b70 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
11b80 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
11b90 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11ba0 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70    assert( iDb==p
11bb0 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65  Tab->iDb );.  }e
11bc0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11bd0 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
11be0 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
11bf0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
11c00 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
11c10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
11c20 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
11c30 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
11c40 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11c50 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
11c60 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
11c70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11c80 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
11c90 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
11ca0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
11cb0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11cc0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
11cd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11ce0 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
11cf0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
11d00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11d10 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
11d20 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
11d30 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
11d40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11d50 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
11d60 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
11d70 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
11d80 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
11d90 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
11da0 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
11db0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
11dc0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
11dd0 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
11de0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
11df0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
11e00 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
11e10 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
11e20 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
11e30 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
11e40 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
11e50 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
11e60 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
11e70 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
11e80 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
11e90 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
11ea0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
11eb0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
11ec0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
11ed0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
11ee0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
11ef0 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
11f00 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
11f10 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
11f20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
11f30 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
11f40 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
11f50 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
11f60 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
11f70 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
11f80 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
11f90 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
11fa0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
11fb0 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20  oken(pName);.   
11fc0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
11fd0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
11fe0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
11ff0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12000 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  ex;.    if( zNam
12010 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
12020 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12030 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
12040 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
12050 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
12060 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
12070 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12080 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12090 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
120a0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49  .busy ){.      I
120b0 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65  ndex *pISameName
120c0 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20  ;    /* Another 
120d0 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73  index with the s
120e0 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
120f0 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e    Table *pTSameN
12100 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62  ame;    /* A tab
12110 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d  le with same nam
12120 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a  e as the index *
12130 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  /.      if( SQLI
12140 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
12150 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
12160 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
12170 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
12180 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65   if( (pISameName
12190 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
121a0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64  dex(db, zName, d
121b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
121c0 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))!=0 ){.      
121d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
121e0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
121f0 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
12200 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
12210 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12220 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12230 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
12240 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pTSameName = sql
12250 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
12260 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
12270 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12280 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12290 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
122a0 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
122b0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
122c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
122d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
122e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
122f0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
12300 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
12310 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
12320 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
12330 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
12340 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
12350 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
12360 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
12370 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22  rintf(zBuf,"_%d"
12380 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
12390 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
123a0 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
123b0 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
123c0 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ex_", pTab->zNam
123d0 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  e, zBuf, (char*)
123e0 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  0);.    if( zNam
123f0 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
12400 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12410 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
12420 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
12430 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
12440 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
12450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12460 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
12470 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12480 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
12490 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
124a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
124b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
124c0 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
124d0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
124e0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
124f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12500 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
12510 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
12520 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
12530 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
12540 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
12550 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
12560 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
12570 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
12580 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
12590 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
125a0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
125b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
125c0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
125d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
125e0 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
125f0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
12600 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
12610 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
12620 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
12630 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
12640 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
12650 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12660 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
12670 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
12680 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
12690 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
126a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
126b0 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Id.z = pTab->aCo
126c0 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
126d0 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
126e0 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c  d.n = strlen(nul
126f0 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
12700 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
12710 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20  istAppend(0, 0, 
12720 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
12730 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
12740 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12750 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
12760 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
12770 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
12780 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
12790 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
127a0 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
127b0 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
127c0 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
127e0 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
127f0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70  eof(CollSeq*))*p
12800 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
12810 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
12820 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
12830 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12840 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
12850 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
12860 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  &pIndex->keyInfo
12870 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45  .aColl[pList->nE
12880 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  xpr];.  pIndex->
12890 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
128a0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
128b0 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
128c0 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
128d0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
128e0 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
128f0 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
12900 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
12910 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
12920 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
12930 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
12940 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
12950 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
12960 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20  ->iDb = iDb;..  
12970 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
12980 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
12990 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
129a0 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
129b0 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
129c0 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
129d0 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
129e0 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
129f0 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
12a00 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
12a10 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
12a20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
12a30 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12a40 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
12a50 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
12a60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12a70 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
12a80 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
12a90 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
12aa0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12ab0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
12ac0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
12ad0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12ae0 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
12af0 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
12b00 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
12b10 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
12b20 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
12b30 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
12b40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12b50 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
12b60 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
12b70 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70  ] = j;.    if( p
12b80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12b90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12ba0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ( pList->a[i].pE
12bb0 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
12bc0 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
12bd0 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
12be0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12bf0 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  ->pColl;.    }el
12c00 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  se{.      pIndex
12c10 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12c20 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  i] = pTab->aCol[
12c30 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].pColl;.    }.
12c40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
12c50 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
12c60 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  l[i] );.    if( 
12c70 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
12c80 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
12c90 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
12ca0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b  Parse, pIndex->k
12cb0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
12cc0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
12cd0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12ce0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
12cf0 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
12d00 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73  fo.nField = pLis
12d10 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28  t->nExpr;..  if(
12d20 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
12d30 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
12d40 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
12d50 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
12d60 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
12d70 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
12d80 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
12d90 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
12da0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
12db0 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
12dc0 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
12dd0 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
12de0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
12df0 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
12e00 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
12e10 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
12e20 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
12e30 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
12e40 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
12e50 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
12e60 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
12e70 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
12e80 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
12e90 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
12ea0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
12eb0 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
12ec0 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
12ed0 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
12ee0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
12ef0 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
12f00 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
12f10 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
12f20 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
12f30 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
12f40 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
12f50 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
12f60 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
12f70 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
12f80 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
12f90 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
12fa0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
12fb0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
12fc0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
12fd0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
12fe0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
12ff0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
13000 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
13010 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
13020 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
13030 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
13040 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
13050 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
13060 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
13070 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
13080 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
13090 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
130a0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
130b0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
130c0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
130d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
130e0 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  if( pIdx->keyInf
130f0 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64  o.aColl[k]!=pInd
13100 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
13110 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  l[k] ) break;.  
13120 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13130 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
13140 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13150 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
13160 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
13170 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
13180 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
13190 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
131a0 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
131b0 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
131c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
131d0 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
131e0 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
131f0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
13200 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
13210 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
13220 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
13230 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
13240 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
13250 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
13260 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
13270 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
13280 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
13290 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
132a0 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
132b0 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
132c0 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
132d0 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
132e0 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
132f0 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
13300 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
13310 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
13320 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
13330 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
13340 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
13350 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
13360 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
13370 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13380 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13390 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
133a0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
133b0 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
133c0 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
133d0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
133e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
133f0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
13400 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
13410 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
13420 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
13430 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
13440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13450 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
13460 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13480 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
13490 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
134a0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
134b0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
134c0 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
134d0 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
134e0 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
134f0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
13500 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
13510 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
13520 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
13530 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
13540 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  b].idxHash, .   
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
13570 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
13580 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
13590 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
135a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
135b0 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
135c0 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
135d0 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
135e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
135f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13600 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
13610 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
13620 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
13630 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
13640 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
13650 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
13660 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
13670 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
13680 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
13690 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
136a0 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
136b0 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
136c0 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
136d0 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
136e0 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
136f0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
13700 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
13710 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
13720 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
13730 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
13740 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
13750 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
13760 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
13770 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
13780 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
13790 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
137a0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
137b0 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
137c0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
137d0 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
137e0 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
137f0 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
13800 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
13810 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
13820 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
13830 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
13840 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
13850 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
13860 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
13870 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
13880 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
13890 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
138a0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
138b0 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
138c0 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
138d0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
138e0 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
138f0 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
13900 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
13910 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
13920 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
13930 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
13940 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
13950 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
13960 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
13970 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
13980 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
13990 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
139a0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
139b0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20  rse->nMem++;..  
139c0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
139d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
139e0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
139f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13a00 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  dex;..    /* Cre
13a10 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
13a20 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
13a30 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
13a40 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
13a50 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
13a60 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
13a70 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13a80 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
13a90 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
13aa0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13ab0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
13ac0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  , 0);..    /* Ga
13ad0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
13ae0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
13af0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
13b00 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
13b10 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
13b20 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
13b30 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
13b40 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  d ){.      /* A 
13b50 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
13b60 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
13b70 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
13b80 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
13b90 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
13ba0 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e  ntf("CREATE%s IN
13bb0 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
13bc0 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
13bd0 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
13be0 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 41 64  QUE",.        Ad
13bf0 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
13c00 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31  dr(pName->z) + 1
13c10 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d  ,.        pName-
13c20 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
13c30 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
13c40 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
13c50 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
13c60 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
13c70 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
13c80 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
13c90 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
13ca0 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  ; */.      zStmt
13cb0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
13cc0 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
13cd0 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   in sqlite_maste
13ce0 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  r for this index
13cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
13d00 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13d10 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
13d20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
13d30 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
13d40 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22  ',%Q,%Q,#0,%Q);"
13d50 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
13d60 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
13d70 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
13d80 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
13d90 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
13da0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
13db0 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
13dc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13dd0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
13de0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
13df0 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a  iteFree(zStmt);.
13e00 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
13e10 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
13e20 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
13e30 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
13e40 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
13e50 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
13e60 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
13e70 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
13e80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
13e90 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
13ea0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
13eb0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
13ec0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
13ed0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
13ee0 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20  e(db, v, iDb);. 
13ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13f00 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(v, OP_ParseS
13f10 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20  chema, iDb, 0,. 
13f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
13f30 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71  Printf("name='%q
13f40 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
13f50 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  e), P3_DYNAMIC);
13f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13f70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78  beAddOp(v, OP_Ex
13f80 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pire, 0, 0);.   
13f90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65   }.  }..  /* Whe
13fa0 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
13fb0 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
13fc0 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
13fd0 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
13fe0 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
13ff0 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
14000 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
14010 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
14020 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
14030 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
14040 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
14050 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
14060 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64   UPDATE.  ** and
14070 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20   INSERT..  */.  
14080 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
14090 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
140a0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
140b0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
140c0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
140d0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
140e0 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
140f0 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
14100 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
14110 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
14120 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
14130 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
14140 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
14150 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
14160 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
14170 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
14180 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
14190 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
141a0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
141b0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
141c0 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
141d0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
141e0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
141f0 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
14200 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
14210 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
14220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
14230 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
14240 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
14250 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
14260 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
14270 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
14280 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
14290 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ndex);.  }.  sql
142a0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
142b0 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
142c0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
142d0 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  e(pTblName);.  s
142e0 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
142f0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
14300 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14310 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
14320 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
14330 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
14340 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
14350 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
14360 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
14370 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
14380 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
14390 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
143a0 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
143b0 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
143c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
143d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
143e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
143f0 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14400 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
14410 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14420 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
14430 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
14440 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
14450 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
14460 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
14470 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14480 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
14490 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
144a0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
144b0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
144c0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
144d0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
144e0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
144f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14500 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
14510 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
14520 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
14530 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
14540 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
14550 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
14560 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
14570 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
14580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14590 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
145a0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
145b0 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
145c0 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
145d0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
145e0 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
145f0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
14600 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
14610 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
14620 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14630 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
14640 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
14650 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
14660 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
14670 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
14680 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14690 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
146a0 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
146b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
146c0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
146d0 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
146e0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
146f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14700 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
14710 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
14720 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14730 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
14740 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
14750 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 70 49  MIT_TEMPDB && pI
14760 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
14770 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
14780 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
14790 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
147a0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
147b0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
147c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
147d0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
147e0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
147f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14800 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
14810 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
14820 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
14830 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
14840 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
14850 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
14860 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
14870 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70  .    int iDb = p
14880 49 6e 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20  Index->iDb;.    
14890 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
148a0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
148b0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
148c0 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
148d0 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  %Q",.       db->
148e0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
148f0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14900 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78  ),.       pIndex
14910 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
14920 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
14930 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
14940 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
14950 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
14960 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
14970 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
14980 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
14990 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
149a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
149b0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
149c0 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
149d0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
149e0 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
149f0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
14a00 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
14a10 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
14a20 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
14a30 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
14a40 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
14a50 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
14a60 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
14a70 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
14a80 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
14a90 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
14aa0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
14ab0 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
14ac0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
14ad0 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
14ae0 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
14af0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
14b00 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
14b10 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
14b20 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
14b30 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d  if( pList->nId>=
14b40 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
14b50 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
14b60 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
14b70 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
14b80 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
14b90 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 5;.    a = sql
14ba0 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
14bb0 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ->a, pList->nAll
14bc0 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  oc*sizeof(pList-
14bd0 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
14be0 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
14bf0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
14c00 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
14c10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
14c20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
14c30 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   a;.  }.  memset
14c40 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
14c50 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nId], 0, sizeo
14c60 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
14c70 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  .  pList->a[pLis
14c80 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20  t->nId].zName = 
14c90 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14ca0 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20  oken(pToken);.  
14cb0 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
14cc0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
14cd0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
14ce0 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
14cf0 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
14d00 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
14d10 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
14d20 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
14d30 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
14d40 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
14d50 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
14d60 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
14d70 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
14d80 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
14d90 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
14da0 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
14db0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
14dc0 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
14dd0 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
14de0 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
14df0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
14e00 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
14e10 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
14e20 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
14e30 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
14e40 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
14e50 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
14e60 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
14e70 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
14e80 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
14e90 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
14ea0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
14eb0 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
14ec0 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
14ed0 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
14ee0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
14ef0 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
14f00 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
14f10 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
14f20 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
14f30 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
14f40 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
14f50 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
14f60 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
14f70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
14f80 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
14f90 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
14fa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
14fb0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
14fc0 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  pend(A,B,0);.**.
14fd0 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
14fe0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
14ff0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
15000 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
15010 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
15020 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
15030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
15040 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
15050 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
15060 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
15070 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
15080 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
15090 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
150a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
150b0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
150c0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54  Token *pTable, T
150d0 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29  oken *pDatabase)
150e0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
150f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
15100 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15110 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
15120 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
15130 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
15140 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
15150 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
15160 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
15170 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  1;.  }.  if( pLi
15180 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d  st->nSrc>=pList-
15190 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
151a0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
151b0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
151c0 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d  *= 2;.    pNew =
151d0 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
151e0 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
151f0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69       sizeof(*pLi
15200 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41  st) + (pList->nA
15210 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
15220 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
15230 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
15240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
15250 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
15260 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
15270 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
15280 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
15290 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
152a0 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
152b0 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ];.  memset(pIte
152c0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  m, 0, sizeof(pLi
152d0 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
152e0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
152f0 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
15300 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
15310 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
15320 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62  Database && pTab
15330 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  le ){.    Token 
15340 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
15350 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
15360 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
15370 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
15380 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
15390 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
153a0 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
153b0 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
153c0 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
153d0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61  ameFromToken(pDa
153e0 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d  tabase);.  pItem
153f0 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ->iCursor = -1;.
15400 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b    pList->nSrc++;
15410 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
15420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
15430 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20   cursors to all 
15440 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
15450 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
15460 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
15470 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
15480 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
15490 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
154a0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
154b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
154c0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
154d0 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
154e0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
154f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
15500 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
15510 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
15520 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
15530 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15540 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
15550 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
15560 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
15570 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
15580 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
15590 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d  ct->pSrc);.    }
155a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
155b0 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
155c0 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
155d0 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
155e0 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
155f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
15600 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
15610 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
15620 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
15630 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
15640 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
15650 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
15660 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61  t->nSrc-1].zAlia
15670 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
15680 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
15690 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
156a0 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
156b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
156c0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
156d0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
156e0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
156f0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
15700 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
15710 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
15720 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
15730 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
15740 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
15750 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
15760 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
15770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15780 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
15790 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
157a0 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
157b0 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
157c0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
157d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
157e0 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
157f0 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
15800 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
15810 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
15820 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
15830 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
15840 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
15850 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
15860 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
15870 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
15880 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
15890 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
158a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
158b0 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
158c0 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
158d0 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
158e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
158f0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
15900 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
15910 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
15920 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
15930 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
15940 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
15950 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
15960 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
15970 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
15980 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
15990 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
159a0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
159b0 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
159c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
159d0 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
159e0 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
159f0 70 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70  pItem->pTab && p
15a00 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72  Item->pTab->isTr
15a10 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
15a20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
15a30 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54  ble(0, pItem->pT
15a40 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
15a50 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
15a60 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  te(pItem->pSelec
15a70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
15a80 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
15a90 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
15aa0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
15ab0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
15ac0 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
15ad0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
15ae0 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
15af0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
15b00 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
15b10 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
15b20 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
15b30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15b40 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
15b50 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
15b60 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
15b70 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
15b80 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
15b90 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
15ba0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
15bb0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
15bc0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
15bd0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15be0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15bf0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
15c00 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
15c10 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
15c20 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15c30 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
15c40 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
15c50 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
15c60 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
15c70 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
15c80 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
15c90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15ca0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
15cb0 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
15cc0 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d  USIVE)+1);.    }
15cd0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
15ce0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
15cf0 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
15d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
15d10 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
15d20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
15d30 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
15d40 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15d50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
15d60 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
15d70 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
15d80 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
15d90 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
15da0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
15db0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
15dc0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
15dd0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
15de0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15df0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15e00 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
15e10 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
15e20 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
15e30 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
15e40 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15e50 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
15e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e70 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
15e80 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
15e90 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
15ea0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
15eb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
15ec0 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
15ed0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
15ee0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15ef0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
15f00 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
15f10 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
15f20 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
15f30 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
15f40 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
15f50 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
15f60 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
15f70 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
15f80 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
15f90 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
15fa0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
15fb0 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
15fc0 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
15fd0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15fe0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
15ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16000 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
16010 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
16020 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
16030 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
16040 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
16050 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
16060 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
16070 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
16080 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
16090 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
160a0 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
160b0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
160c0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
160d0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
160e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
160f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16100 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
16110 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
16120 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
16130 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
16140 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
16150 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
16160 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53   0, 0, MAX_PAGES
16170 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  , &db->aDb[1].pB
16180 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
16190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
161a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
161b0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
161c0 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
161d0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
161e0 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
161f0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
16200 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
16210 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
16220 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
16230 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
16240 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
16250 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
16260 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
16270 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
16280 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d  Trans(db->aDb[1]
16290 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  .pBt, 1);.      
162a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
162b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
162c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
162d0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
162e0 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  get a write lock
162f0 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   on ".          
16300 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64  "the temporary d
16310 61 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a  atabase file");.
16320 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
16330 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
16340 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
16350 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
16360 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
16370 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
16380 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76  code that will v
16390 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
163a0 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72   cookie and star
163b0 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e  t.** a read-tran
163c0 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20  saction for all 
163d0 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  named database f
163e0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  iles..**.** It i
163f0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
16400 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b   all schema cook
16410 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20  ies be verified 
16420 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20  and all.** read 
16430 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20  transactions be 
16440 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
16450 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70  nything else hap
16460 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56  pens in.** the V
16470 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75  DBE program.  Bu
16480 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  t this routine c
16490 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  an be called aft
164a0 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a  er much other.**
164b0 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67   code has been g
164c0 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65  enerated.  So he
164d0 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f  re is what we do
164e0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  :.**.** The firs
164f0 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
16500 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
16510 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74  e code an OP_Got
16520 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a  o that.** will j
16530 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74  ump to a subrout
16540 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ine at the end o
16550 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20  f the program.  
16560 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72  Then we.** recor
16570 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  d every database
16580 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20   that needs its 
16590 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20  schema verified 
165a0 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65  in the.** pParse
165b0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65  ->cookieMask fie
165c0 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65  ld.  Later, afte
165d0 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65  r all other code
165e0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e   has been.** gen
165f0 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72  erated, the subr
16600 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
16610 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
16620 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  fications and.**
16630 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e   starts the tran
16640 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65  sactions will be
16650 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f   coded and the O
16660 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a  P_Goto P2 value.
16670 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  ** will be made 
16680 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
16690 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
166a0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
166b0 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65  the.** cookie ve
166c0 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f  rification subro
166d0 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65  utine code happe
166e0 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e  ns in sqlite3Fin
166f0 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a  ishCoding()..**.
16700 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e  ** If iDb<0 then
16710 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74   code the OP_Got
16720 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73  o only - don't s
16730 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66  et flag to verif
16740 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  y the.** schema 
16750 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73  on any databases
16760 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
16770 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  sed to position 
16780 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65  the OP_Goto.** e
16790 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65  arly in the code
167a0 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77  , before we know
167b0 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   if any database
167c0 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20   tables will be 
167d0 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
167e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
167f0 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
16800 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
16810 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16820 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d  Vdbe *v;.  int m
16830 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  ask;..  v = sqli
16840 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16850 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
16860 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69   return;  /* Thi
16870 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
16880 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72  f there was a pr
16890 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64  ior error */.  d
168a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
168b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
168c0 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20  okieGoto==0 ){. 
168d0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
168e0 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  eGoto = sqlite3V
168f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
16900 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
16910 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
16920 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
16930 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
16940 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
16950 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
16960 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  iDb==1 );.    as
16970 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a  sert( iDb<32 );.
16980 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44      mask = 1<<iD
16990 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72  b;.    if( (pPar
169a0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  se->cookieMask &
169b0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
169c0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
169d0 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
169e0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f       pParse->coo
169f0 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
16a00 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
16a10 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
16a20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
16a30 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
16a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
16a50 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
16a60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
16a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16a80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
16a90 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
16aa0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
16ab0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
16ac0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
16ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
16ae0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16af0 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
16b00 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
16b10 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
16b20 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
16b30 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
16b40 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
16b50 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
16b60 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
16b70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
16b80 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
16b90 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
16ba0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
16bb0 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
16bc0 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
16bd0 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
16be0 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
16bf0 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
16c00 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
16c10 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
16c20 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
16c30 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
16c40 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
16c50 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
16c60 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
16c70 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
16c80 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
16c90 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
16ca0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
16cb0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
16cc0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
16cd0 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
16ce0 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
16cf0 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
16d00 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
16d10 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
16d20 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79   set..**.** Only
16d30 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e   database iDb an
16d40 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
16d50 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
16d60 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61  table by this ca
16d70 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30  ll..** If iDb==0
16d80 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
16d90 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73  and temp databas
16da0 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  es are made writ
16db0 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44  able.   If.** iD
16dc0 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74  b==1 then only t
16dd0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
16de0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
16df0 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65  e.  If iDb>1 the
16e00 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  n the.** specifi
16e10 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ed auxiliary dat
16e20 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65  abase and the te
16e30 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
16e40 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a  made writable..*
16e50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
16e60 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
16e70 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
16e80 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
16e90 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  t, int iDb){.  V
16ea0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
16eb0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16ec0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
16ed0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43  turn;.  sqlite3C
16ee0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
16ef0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
16f00 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
16f10 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69  k |= 1<<iDb;.  i
16f20 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  f( setStatement 
16f30 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
16f40 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
16f50 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16f60 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44  OP_Statement, iD
16f70 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  b, 0);.  }.  if(
16f80 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c   (OMIT_TEMPDB ||
16f90 20 69 44 62 21 3d 31 29 20 26 26 20 70 50 61 72   iDb!=1) && pPar
16fa0 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  se->db->aDb[1].p
16fb0 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Bt!=0 ){.    sql
16fc0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16fd0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16fe0 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29  setStatement, 1)
16ff0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
17000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17010 31 36 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  16./* .** Return
17020 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 73   the transient s
17030 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
17040 65 63 74 20 75 73 65 64 20 66 6f 72 20 65 6e 63  ect used for enc
17050 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e  oding conversion
17060 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 20  s.** during SQL 
17070 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  compilation..*/.
17080 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
17090 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65  qlite3GetTransie
170a0 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 20  ntValue(sqlite3 
170b0 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d  *db){.  if( !db-
170c0 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64  >pValue ){.    d
170d0 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69  b->pValue = sqli
170e0 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
170f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
17100 70 56 61 6c 75 65 3b 0a 7d 0a 23 65 6e 64 69 66  pValue;.}.#endif
17110 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
17120 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
17130 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
17140 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
17150 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
17160 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
17170 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
17180 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
17190 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
171a0 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
171b0 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
171c0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20  CollSeq *pColl, 
171d0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
171e0 20 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78    int n = pIndex
171f0 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  ->keyInfo.nField
17200 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70  ;.  CollSeq **pp
17210 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e   = pIndex->keyIn
17220 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c  fo.aColl;.  whil
17230 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66  e( n-- ){.    if
17240 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72  ( *pp==pColl ) r
17250 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b  eturn 1;.    pp+
17260 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
17270 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
17280 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
17290 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
172a0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
172b0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
172c0 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
172d0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
172e0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
172f0 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
17300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17310 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72  T_REINDEX.void r
17320 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
17330 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
17340 20 2a 70 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20   *pTab, CollSeq 
17350 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *pColl){.  Index
17360 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
17370 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
17380 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
17390 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
173a0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
173b0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
173c0 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
173d0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
173e0 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
173f0 69 6f 6e 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70  ionMatch(pColl,p
17400 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
17410 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
17420 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
17430 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29  e, 0, pTab->iDb)
17440 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
17450 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
17460 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
17470 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
17480 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
17490 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
174a0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
174b0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
174c0 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
174d0 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
174e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
174f0 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
17500 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
17510 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
17520 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
17530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17540 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
17550 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
17560 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
17570 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
17580 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175a0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
175b0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
175c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
175d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
175e0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
175f0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
17600 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
17610 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
17620 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
17630 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
17660 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
17670 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
17680 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
17690 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
176a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
176b0 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  ..  for(iDb=0, p
176c0 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
176d0 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
176e0 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pDb++){.    if( 
176f0 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pDb==0 ) continu
17700 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73  e;.      for(k=s
17710 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
17720 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  pDb->tblHash);  
17730 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
17740 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
17750 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
17760 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
17770 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
17780 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
17790 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , pColl);.    }.
177a0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
177b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
177c0 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
177d0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
177e0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17800 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
17810 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
17820 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
17840 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
17850 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
17860 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
17870 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
17880 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
17890 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
178a0 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
178b0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
178c0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
178d0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
178e0 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
178f0 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
17900 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
17910 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
17920 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
17930 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
17940 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
17950 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
17960 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
17970 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
17980 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
17990 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
179a0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
179b0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
179c0 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
179d0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
179e0 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
179f0 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
17a00 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
17a10 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
17a20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
17a30 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
17a40 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
17a50 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
17a80 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
17a90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17aa0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
17ab0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
17ac0 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
17ad0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
17ae0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
17af0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
17b00 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
17b10 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
17b20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
17b30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17b40 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
17b50 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
17b60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
17b70 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
17b80 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
17b90 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
17ba0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
17bb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
17bc0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
17bd0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
17be0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
17bf0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
17c00 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
17c10 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
17c20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
17c30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
17c40 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
17c50 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
17c60 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
17c70 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
17c80 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
17c90 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
17ca0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
17cb0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
17cc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
17cd0 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me1==0 || pName1
17ce0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ->z==0 ){.    re
17cf0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
17d00 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
17d10 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
17d20 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
17d30 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
17d40 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
17d50 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
17d60 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61 6d  b, db->enc, pNam
17d70 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e  e1->z, pName1->n
17d80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
17d90 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
17da0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
17db0 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  arse, pColl);.  
17dc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
17dd0 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  }.  }.  iDb = sq
17de0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17df0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17e00 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
17e10 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
17e20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
17e30 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17e40 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b  Token(pObjName);
17e50 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
17e60 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70  [iDb].zName;.  p
17e70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
17e80 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
17e90 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
17ea0 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
17eb0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
17ec0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
17ed0 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74 75  ree(z);.    retu
17ee0 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
17ef0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
17f00 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
17f10 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29  .  sqliteFree(z)
17f20 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
17f30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
17f40 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
17f50 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
17f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
17f70 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
17f80 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
17f90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
17fa0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17fb0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
17fc0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
17fd0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
17fe0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
17ff0 69 66 0a                                         if.